summaryrefslogtreecommitdiffstats
path: root/Lib/copy.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2003-02-06 22:57:00 (GMT)
committerGuido van Rossum <guido@python.org>2003-02-06 22:57:00 (GMT)
commit5aac4e631292faf7f1679b28c906dd823c734b2d (patch)
tree98a3ffa79c235fe9d06839d304c934517dc274d9 /Lib/copy.py
parente7ee17c58e4271d72f9a6609c92fdaeeb9c9ba79 (diff)
downloadcpython-5aac4e631292faf7f1679b28c906dd823c734b2d.zip
cpython-5aac4e631292faf7f1679b28c906dd823c734b2d.tar.gz
cpython-5aac4e631292faf7f1679b28c906dd823c734b2d.tar.bz2
Move _better_reduce from copy.py to copy_reg.py, and also use it in
pickle.py, where it makes save_newobj() unnecessary. Tests pass.
Diffstat (limited to 'Lib/copy.py')
-rw-r--r--Lib/copy.py42
1 files changed, 1 insertions, 41 deletions
diff --git a/Lib/copy.py b/Lib/copy.py
index 739cf2d..4133a1f 100644
--- a/Lib/copy.py
+++ b/Lib/copy.py
@@ -51,7 +51,7 @@ __getstate__() and __setstate__(). See the documentation for module
# XXX need to support copy_reg here too...
import types
-from pickle import _slotnames
+from copy_reg import _better_reduce
class Error(Exception):
pass
@@ -89,46 +89,6 @@ def copy(x):
else:
y = copierfunction(x)
return y
-
-def __newobj__(cls, *args):
- return cls.__new__(cls, *args)
-
-def _better_reduce(obj):
- cls = obj.__class__
- getnewargs = getattr(obj, "__getnewargs__", None)
- if getnewargs:
- args = getnewargs()
- else:
- args = ()
- getstate = getattr(obj, "__getstate__", None)
- if getstate:
- try:
- state = getstate()
- except TypeError, err:
- # XXX Catch generic exception caused by __slots__
- if str(err) != ("a class that defines __slots__ "
- "without defining __getstate__ "
- "cannot be pickled"):
- raise # Not that specific exception
- getstate = None
- if not getstate:
- state = getattr(obj, "__dict__", None)
- names = _slotnames(cls)
- if names:
- slots = {}
- nil = []
- for name in names:
- value = getattr(obj, name, nil)
- if value is not nil:
- slots[name] = value
- if slots:
- state = (state, slots)
- listitems = dictitems = None
- if isinstance(obj, list):
- listitems = iter(obj)
- elif isinstance(obj, dict):
- dictitems = obj.iteritems()
- return __newobj__, (cls,) + args, state, listitems, dictitems
_copy_dispatch = d = {}