jsonpickle
jsonpickle copied to clipboard
AttributeError: 'Int64' object attribute '_type_marker' is read-only
Hello, this error happens on version 3.0.4, I reverted back to 3.0.3 and the error has stopped.
Python Version: Python 3.12.3 Jsonpickle Version: 3.0.4 OS: Docker, python:3-slim (Debian GNU/Linux 12) Code: https://github.com/BattleBanana/BattleBanana/blob/master/dueutil/game/players.py#L516-L523 Stacktrace:
Traceback (most recent call last):
File "/usr/local/lib/python3.12/site-packages/discord/client.py", line 441, in _run_event
await coro(*args, **kwargs)
File "/usr/src/app/run.py", line 338, in on_message
await events.on_message_event(message)
File "/usr/src/app/dueutil/events.py", line 100, in on_message_event
await message_event(ctx)
File "/usr/src/app/dueutil/events.py", line 17, in __call__
if await listener(ctx):
^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/dueutil/game/game.py", line 264, in on_message
player = players.find_player(message.author.id)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/dueutil/game/players.py", line 507, in find_player
elif load_player(user_id):
^^^^^^^^^^^^^^^^^^^^
File "/usr/src/app/dueutil/game/players.py", line 521, in load_player
loaded_player = jsonpickle.decode(player_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 98, in decode
return context.restore(data, reset=reset, classes=classes)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 378, in restore
value = self._restore(obj)
^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 360, in _restore
return restore(obj)
^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 797, in _restore_object
return self._restore_object_instance(obj, cls, class_name)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 772, in _restore_object_instance
instance = self._restore_object_instance_variables(obj, instance)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 718, in _restore_object_instance_variables
instance = self._restore_state(obj, instance)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 677, in _restore_state
state = self._restore(obj[tags.STATE])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 360, in _restore
return restore(obj)
^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 849, in _restore_dict
data[k] = self._restore(v)
^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 360, in _restore
return restore(obj)
^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 443, in _restore_list
children = [self._restore(v) for v in obj]
^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 360, in _restore
return restore(obj)
^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 797, in _restore_object
return self._restore_object_instance(obj, cls, class_name)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 772, in _restore_object_instance
instance = self._restore_object_instance_variables(obj, instance)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 718, in _restore_object_instance_variables
instance = self._restore_state(obj, instance)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 677, in _restore_state
state = self._restore(obj[tags.STATE])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 360, in _restore
return restore(obj)
^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 849, in _restore_dict
data[k] = self._restore(v)
^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 360, in _restore
return restore(obj)
^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 797, in _restore_object
return self._restore_object_instance(obj, cls, class_name)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 772, in _restore_object_instance
instance = self._restore_object_instance_variables(obj, instance)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 706, in _restore_object_instance_variables
instance = self._restore_from_dict(obj, instance)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 658, in _restore_from_dict
raise e
File "/usr/local/lib/python3.12/site-packages/jsonpickle/unpickler.py", line 637, in _restore_from_dict
setattr(instance, k, value)
AttributeError: 'Int64' object attribute '_type_marker' is read-only
Thanks for the heads-up. Can you provide a minimally reproducible example? Ideally it'd be something we can add to our test suite to avoid breaking this in the future as well.
import jsonpickle
unpickled = jsonpickle.decode("""{
"py/object": "bson.int64.Int64",
"py/newargs": { "py/tuple": [123456789012345678] },
"_type_marker": 18,
"as_integer_ratio": {
"py/function": "bson.int64.Int64.as_integer_ratio"
},
"bit_count": { "py/function": "bson.int64.Int64.bit_count" },
"bit_length": { "py/function": "bson.int64.Int64.bit_length" },
"conjugate": { "py/function": "bson.int64.Int64.conjugate" },
"denominator": 1,
"from_bytes": { "py/function": "builtins.Int64.from_bytes" },
"imag": 0,
"numerator": 123456789012345678,
"real": 123456789012345678,
"to_bytes": { "py/function": "bson.int64.Int64.to_bytes" }
}
""")