Closed
Description
Bug report
Bug description:
import io
import pickle
class ZeroCopyByteArray(bytearray):
def __reduce_ex__(self, protocol):
return type(self), (pickle.PickleBuffer(self),), None
data = [
ZeroCopyByteArray(),
ZeroCopyByteArray(),
]
# this works
f = io.BytesIO()
pickler = pickle.Pickler(f, protocol=5)
pickler.dump(data)
# this hits memo assertion
f = io.BytesIO()
pickler = pickle._Pickler(f, protocol=5)
pickler.dump(data)
Traceback (most recent call last):
File "bug.py", line 24, in <module>
pickler.dump(data)
File "/pickle.py", line 487, in dump
self.save(obj)
File "/pickle.py", line 560, in save
f(self, obj) # Call unbound method with explicit self
^^^^^^^^^^^^
File "/pickle.py", line 932, in save_list
self._batch_appends(obj)
File "/pickle.py", line 956, in _batch_appends
save(x)
File "/pickle.py", line 603, in save
self.save_reduce(obj=obj, *rv)
File "/pickle.py", line 692, in save_reduce
save(args)
File "/pickle.py", line 560, in save
f(self, obj) # Call unbound method with explicit self
^^^^^^^^^^^^
File "/pickle.py", line 887, in save_tuple
save(element)
File "/pickle.py", line 560, in save
f(self, obj) # Call unbound method with explicit self
^^^^^^^^^^^^
File "/pickle.py", line 842, in save_picklebuffer
self.save_bytearray(m.tobytes())
File "/pickle.py", line 821, in save_bytearray
self.memoize(obj)
File "/pickle.py", line 508, in memoize
assert id(obj) not in self.memo
^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError
CPython versions tested on:
3.11
Operating systems tested on:
Linux
Linked PRs
- gh-120380: fix Python implementation of
pickle.Pickler
forbytes
andbytearray
objects in protocol version 5. #120422 - [3.13] gh-120380: fix Python implementation of
pickle.Pickler
forbytes
andbytearray
objects in protocol version 5. (GH-120422) #120832 - [3.12] gh-120380: fix Python implementation of
pickle.Pickler
forbytes
andbytearray
objects in protocol version 5. (GH-120422) #120833
Metadata
Metadata
Assignees
Projects
Status
Done