|
|
|
@ -217,6 +217,24 @@ class TestPartialC(TestPartial, unittest.TestCase): |
|
|
|
['{}({!r}, {}, {})'.format(name, capture, args_repr, kwargs_repr) |
|
|
|
for kwargs_repr in kwargs_reprs]) |
|
|
|
|
|
|
|
def test_recursive_repr(self): |
|
|
|
if self.partial is c_functools.partial: |
|
|
|
name = 'functools.partial' |
|
|
|
else: |
|
|
|
name = self.partial.__name__ |
|
|
|
|
|
|
|
f = self.partial(capture) |
|
|
|
f.__setstate__((f, (), {}, {})) |
|
|
|
self.assertEqual(repr(f), '%s(%s(...))' % (name, name)) |
|
|
|
|
|
|
|
f = self.partial(capture) |
|
|
|
f.__setstate__((capture, (f,), {}, {})) |
|
|
|
self.assertEqual(repr(f), '%s(%r, %s(...))' % (name, capture, name)) |
|
|
|
|
|
|
|
f = self.partial(capture) |
|
|
|
f.__setstate__((capture, (), {'a': f}, {})) |
|
|
|
self.assertEqual(repr(f), '%s(%r, a=%s(...))' % (name, capture, name)) |
|
|
|
|
|
|
|
def test_pickle(self): |
|
|
|
f = self.partial(signature, ['asdf'], bar=[True]) |
|
|
|
f.attr = [] |
|
|
|
@ -297,6 +315,25 @@ class TestPartialC(TestPartial, unittest.TestCase): |
|
|
|
self.assertEqual(r, ((1, 2), {})) |
|
|
|
self.assertIs(type(r[0]), tuple) |
|
|
|
|
|
|
|
def test_recursive_pickle(self): |
|
|
|
f = self.partial(capture) |
|
|
|
f.__setstate__((f, (), {}, {})) |
|
|
|
for proto in range(pickle.HIGHEST_PROTOCOL + 1): |
|
|
|
with self.assertRaises(RecursionError): |
|
|
|
pickle.dumps(f, proto) |
|
|
|
|
|
|
|
f = self.partial(capture) |
|
|
|
f.__setstate__((capture, (f,), {}, {})) |
|
|
|
for proto in range(pickle.HIGHEST_PROTOCOL + 1): |
|
|
|
f_copy = pickle.loads(pickle.dumps(f, proto)) |
|
|
|
self.assertIs(f_copy.args[0], f_copy) |
|
|
|
|
|
|
|
f = self.partial(capture) |
|
|
|
f.__setstate__((capture, (), {'a': f}, {})) |
|
|
|
for proto in range(pickle.HIGHEST_PROTOCOL + 1): |
|
|
|
f_copy = pickle.loads(pickle.dumps(f, proto)) |
|
|
|
self.assertIs(f_copy.keywords['a'], f_copy) |
|
|
|
|
|
|
|
# Issue 6083: Reference counting bug |
|
|
|
def test_setstate_refcount(self): |
|
|
|
class BadSequence: |
|
|
|
|