diff options
author | Georg Brandl <georg@python.org> | 2006-03-31 18:25:44 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2006-03-31 18:25:44 (GMT) |
commit | 22ec80bc4f3e66990981ca57b66b38873e2711df (patch) | |
tree | 6374fe9880a0a2f4d2d7442a0bbffc85bcca3440 /Lib/copy_reg.py | |
parent | 43f08a85e4b86acf6e4313a51cec4df0cc586da7 (diff) | |
download | cpython-22ec80bc4f3e66990981ca57b66b38873e2711df.zip cpython-22ec80bc4f3e66990981ca57b66b38873e2711df.tar.gz cpython-22ec80bc4f3e66990981ca57b66b38873e2711df.tar.bz2 |
Patch #1462313, bug #1443328: the pickle modules now can handle classes
that have __private names in their __slots__.
Diffstat (limited to 'Lib/copy_reg.py')
-rw-r--r-- | Lib/copy_reg.py | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/Lib/copy_reg.py b/Lib/copy_reg.py index f499013..f87c50f 100644 --- a/Lib/copy_reg.py +++ b/Lib/copy_reg.py @@ -116,8 +116,19 @@ def _slotnames(cls): # Slots found -- gather slot names from all base classes for c in cls.__mro__: if "__slots__" in c.__dict__: - names += [name for name in c.__dict__["__slots__"] - if name not in ("__dict__", "__weakref__")] + slots = c.__dict__['__slots__'] + # if class has a single slot, it can be given as a string + if isinstance(slots, basestring): + slots = (slots,) + for name in slots: + # special descriptors + if name in ("__dict__", "__weakref__"): + continue + # mangled names + elif name.startswith('__') and not name.endswith('__'): + names.append('_%s%s' % (c.__name__, name)) + else: + names.append(name) # Cache the outcome in the class if at all possible try: |