diff options
author | Guido van Rossum <guido@python.org> | 2003-02-19 01:19:28 +0000 |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2003-02-19 01:19:28 +0000 |
commit | e690883ccf8081e5baab0e9d71f596f26245b569 (patch) | |
tree | 57c21839dbb39b03056f9d19c9c054fbb060900f /Lib/copy.py | |
parent | Fix bug 683658 - PyErr_Warn may cause import deadlock. (diff) | |
download | cpython-e690883ccf8081e5baab0e9d71f596f26245b569.tar.gz cpython-e690883ccf8081e5baab0e9d71f596f26245b569.tar.bz2 cpython-e690883ccf8081e5baab0e9d71f596f26245b569.zip |
Use __reduce_ex__ in copy.py. The test_*copy_cant() tests are simpler again.
Diffstat (limited to 'Lib/copy.py')
-rw-r--r-- | Lib/copy.py | 56 |
1 files changed, 34 insertions, 22 deletions
diff --git a/Lib/copy.py b/Lib/copy.py index b57fa89710a..9b9f5b3c9f7 100644 --- a/Lib/copy.py +++ b/Lib/copy.py @@ -79,14 +79,20 @@ def copy(x): return copier(x) reductor = dispatch_table.get(cls) - if not reductor: - reductor = getattr(cls, "__reduce__", None) - if reductor == object.__reduce__: - reductor = _better_reduce - elif not reductor: - raise Error("un(shallow)copyable object of type %s" % cls) - - return _reconstruct(x, reductor(x), 0) + if reductor: + rv = reductor(x) + else: + reductor = getattr(x, "__reduce_ex__", None) + if reductor: + rv = reductor(2) + else: + reductor = getattr(x, "__reduce__", None) + if reductor: + rv = reductor() + else: + raise Error("un(shallow)copyable object of type %s" % cls) + + return _reconstruct(x, rv, 0) _copy_dispatch = d = {} @@ -176,21 +182,27 @@ def deepcopy(x, memo=None, _nil=[]): except TypeError: # cls is not a class (old Boost; see SF #502085) issc = 0 if issc: - copier = _deepcopy_atomic + y = _deepcopy_atomic(x, memo) else: - copier = getattr(cls, "__deepcopy__", None) - - if copier: - y = copier(x, memo) - else: - reductor = dispatch_table.get(cls) - if not reductor: - reductor = getattr(cls, "__reduce__", None) - if reductor == object.__reduce__: - reductor = _better_reduce - elif not reductor: - raise Error("un(deep)copyable object of type %s" % cls) - y = _reconstruct(x, reductor(x), 1, memo) + copier = getattr(x, "__deepcopy__", None) + if copier: + y = copier(memo) + else: + reductor = dispatch_table.get(cls) + if reductor: + rv = reductor(x) + else: + reductor = getattr(x, "__reduce_ex__", None) + if reductor: + rv = reductor(2) + else: + reductor = getattr(x, "__reduce__", None) + if reductor: + rv = reductor() + else: + raise Error( + "un(deep)copyable object of type %s" % cls) + y = _reconstruct(x, rv, 1, memo) memo[d] = y _keep_alive(x, memo) # Make sure x lives at least as long as d |