mirror of
https://github.com/python/cpython.git
synced 2025-11-25 04:34:37 +00:00
Issue #7689: Allow pickling of dynamically created classes when their
metaclass is registered with copyreg. Patch by Nicolas M. Thiéry and Craig Citro.
This commit is contained in:
parent
ad349a190e
commit
561a821e93
5 changed files with 41 additions and 14 deletions
|
|
@ -124,6 +124,19 @@ class metaclass(type):
|
|||
class use_metaclass(object):
|
||||
__metaclass__ = metaclass
|
||||
|
||||
class pickling_metaclass(type):
|
||||
def __eq__(self, other):
|
||||
return (type(self) == type(other) and
|
||||
self.reduce_args == other.reduce_args)
|
||||
|
||||
def __reduce__(self):
|
||||
return (create_dynamic_class, self.reduce_args)
|
||||
|
||||
def create_dynamic_class(name, bases):
|
||||
result = pickling_metaclass(name, bases, dict())
|
||||
result.reduce_args = (name, bases)
|
||||
return result
|
||||
|
||||
# DATA0 .. DATA2 are the pickles we expect under the various protocols, for
|
||||
# the object returned by create_data().
|
||||
|
||||
|
|
@ -609,6 +622,14 @@ class AbstractPickleTests(unittest.TestCase):
|
|||
b = self.loads(s)
|
||||
self.assertEqual(a.__class__, b.__class__)
|
||||
|
||||
def test_dynamic_class(self):
|
||||
a = create_dynamic_class("my_dynamic_class", (object,))
|
||||
copy_reg.pickle(pickling_metaclass, pickling_metaclass.__reduce__)
|
||||
for proto in protocols:
|
||||
s = self.dumps(a, proto)
|
||||
b = self.loads(s)
|
||||
self.assertEqual(a, b)
|
||||
|
||||
def test_structseq(self):
|
||||
import time
|
||||
import os
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue