12
>>> pickle.loads(pickle.dumps(a))
18
def __init__(self, value):
22
return "A(%s)" % self.value
25
return A, (self.value,)
29
>>> b = B(x=37, y=389); b
32
>>> pickle.loads(pickle.dumps(b))
41
def __init__(self, x=0, y=0):
46
return "%s(x=%s, y=%s)" % (self.__class__.__name__, self.x, self.y)
49
return makeObj, (type(self), {'x': self.x, 'y': self.y})
51
def makeObj(obj_type, kwds):
52
return obj_type(**kwds)
58
>>> pickle.loads(pickle.dumps(C(x=37, y=389)))
64
@cython.auto_pickle(True) # Not needed, just to test the directive.
65
cdef class DefaultReduce(object):
67
>>> a = DefaultReduce(11, 'abc'); a
68
DefaultReduce(i=11, s='abc')
70
>>> pickle.loads(pickle.dumps(a))
71
DefaultReduce(i=11, s='abc')
72
>>> pickle.loads(pickle.dumps(DefaultReduce(i=11, s=None)))
73
DefaultReduce(i=11, s=None)
79
def __init__(self, i=0, s=None):
84
return "DefaultReduce(i=%s, s=%r)" % (self.i, self.s)
87
cdef class DefaultReduceSubclass(DefaultReduce):
89
>>> a = DefaultReduceSubclass(i=11, s='abc', x=1.5); a
90
DefaultReduceSubclass(i=11, s='abc', x=1.5)
92
>>> pickle.loads(pickle.dumps(a))
93
DefaultReduceSubclass(i=11, s='abc', x=1.5)
98
def __init__(self, **kwargs):
99
self.x = kwargs.pop('x', 0)
100
super(DefaultReduceSubclass, self).__init__(**kwargs)
103
return "DefaultReduceSubclass(i=%s, s=%r, x=%s)" % (self.i, self.s, self.x)
106
cdef class result(DefaultReduceSubclass):
108
>>> a = result(i=11, s='abc', x=1.5); a
109
result(i=11, s='abc', x=1.5)
111
>>> pickle.loads(pickle.dumps(a))
112
result(i=11, s='abc', x=1.5)
116
return "result(i=%s, s=%r, x=%s)" % (self.i, self.s, self.x)
119
class DefaultReducePySubclass(DefaultReduce):
121
>>> a = DefaultReducePySubclass(i=11, s='abc', x=1.5); a
122
DefaultReducePySubclass(i=11, s='abc', x=1.5)
124
>>> pickle.loads(pickle.dumps(a))
125
DefaultReducePySubclass(i=11, s='abc', x=1.5)
127
>>> a.self_reference = a
128
>>> a2 = pickle.loads(pickle.dumps(a))
129
>>> a2.self_reference is a2
132
def __init__(self, **kwargs):
133
self.x = kwargs.pop('x', 0)
134
super(DefaultReducePySubclass, self).__init__(**kwargs)
137
return "DefaultReducePySubclass(i=%s, s=%r, x=%s)" % (self.i, self.s, self.x)
140
cdef class NoReduceDueToIntPtr(object):
143
>>> pickle.dumps(NoReduceDueToIntPtr())
144
Traceback (most recent call last):
146
TypeError: self.int_ptr cannot be converted to a Python object for pickling
150
cdef class NoReduceDueToNontrivialCInit(object):
153
>>> pickle.dumps(NoReduceDueToNontrivialCInit(None))
154
Traceback (most recent call last):
156
TypeError: no default __reduce__ due to non-trivial __cinit__
158
def __cinit__(self, arg):
162
cdef class NoMembers(object):
165
>>> pickle.loads(pickle.dumps(NoMembers()))
172
cdef class NoPyMembers(object):
175
>>> pickle.loads(pickle.dumps(NoPyMembers(2, 1.75)))
176
NoPyMembers(ii=[2, 4, 8], x=1.75)
181
def __init__(self, i, x):
184
self.ii[2] = i * i * i
188
return "%s(ii=%s, x=%s)" % (type(self).__name__, self.ii, self.x)
190
def __eq__(self, other):
192
isinstance(other, NoPyMembers) and
193
(<NoPyMembers> other).ii[0] == self.ii[0] and
194
(<NoPyMembers> other).ii[1] == self.ii[1] and
195
(<NoPyMembers> other).ii[2] == self.ii[2] and
196
(<NoPyMembers> other).x == self.x
200
class NoPyMembersPySubclass(NoPyMembers):
203
>>> pickle.loads(pickle.dumps(NoPyMembersPySubclass(2, 1.75, 'xyz')))
204
NoPyMembersPySubclass(ii=[2, 4, 8], x=1.75, s='xyz')
206
def __init__(self, i, x, s):
207
super(NoPyMembersPySubclass, self).__init__(i, x)
210
return (super(NoPyMembersPySubclass, self).__repr__()
211
[:-1] + ', s=%r)' % self.s)
218
cdef class StructMemberDefault(object):
221
>>> s = StructMemberDefault(1, 1.5); s
222
StructMemberDefault(i=1, x=1.5)
223
>>> pickle.dumps(s) # doctest: +ELLIPSIS
224
Traceback (most recent call last):
225
TypeError: ...my_struct...
228
cdef MyStruct my_struct
230
def __init__(self, i, x):
235
return "%s(i=%s, x=%s)" % (
236
type(self).__name__, self.my_struct.i, self.my_struct.x)
238
@cython.auto_pickle(True) # Forced due to the (inherited) struct attribute.
239
cdef class StructMemberForcedPickle(StructMemberDefault):
242
>>> s = StructMemberForcedPickle(1, 1.5); s
243
StructMemberForcedPickle(i=1, x=1.5)
244
>>> pickle.loads(pickle.dumps(s))
245
StructMemberForcedPickle(i=1, x=1.5)
249
cdef _unset = object()
251
# Test cyclic references.
252
cdef class Wrapper(object):
257
>>> w2 = pickle.loads(pickle.dumps(w)); w2
262
>>> pickle.loads(pickle.dumps(Wrapper(DefaultReduce(1, 'xyz'))))
263
Wrapper(DefaultReduce(i=1, s='xyz'))
267
>>> pickle.loads(pickle.dumps(Wrapper(L)))
270
>>> L[0] = w # Don't print this one out...
271
>>> w2 = pickle.loads(pickle.dumps(w))
275
cdef public object ref
276
def __init__(self, ref=_unset):
283
return "Wrapper(...)"
285
return "Wrapper(%r)" % self.ref
288
# Non-regression test for pickling bound and unbound methods of non-extension
290
class MyClass(object):
293
>>> pickle.loads(pickle.dumps(MyClass.my_method)) is MyClass.my_method
295
>>> bound_method = pickle.loads(pickle.dumps(MyClass().my_method))
299
def my_method(self, x):
303
# Pickled with Cython 0.29.28 (using MD5 for the checksum).
304
OLD_MD5_PICKLE = b'''\
305
creduce_pickle\n__pyx_unpickle_NoPyMembers\nq\x00\
306
(creduce_pickle\nNoPyMembers\nq\x01J\xf2K_\n(]q\x02\
307
(K\x0bKyM3\x05eG?\xf8\x00\x00\x00\x00\x00\x00tq\x03tq\x04Rq\x05.\
311
from hashlib import md5
315
def unpickle_old_0_29_28():
318
>>> b = pickle.loads(OLD_MD5_PICKLE)
319
>>> b == NoPyMembers(i=11, x=1.5) or b