]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-38293: Allow shallow and deep copying of property objects (GH-16438)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sun, 12 Jan 2020 18:00:27 +0000 (10:00 -0800)
committerGitHub <noreply@github.com>
Sun, 12 Jan 2020 18:00:27 +0000 (10:00 -0800)
Copying property objects results in a TypeError. Steps to reproduce:

```
>>> import copy
>>> obj = property()
>>> copy.copy(obj)
````

This affects both shallow and deep copying.
My idea for a fix is to add property objects to the list of "atomic" objects in the copy module.
These already include types like functions and type objects.

I also added property objects to the unit tests test_copy_atomic and test_deepcopy_atomic. This is my first PR, and it's highly likely I've made some mistake, so please be kind :)

https://bugs.python.org/issue38293
(cherry picked from commit 9f3fc6c5b4993f2b362263b494f84793a21aa073)

Co-authored-by: Guðni Natan Gunnarsson <1493259+GudniNatan@users.noreply.github.com>
Lib/copy.py
Lib/test/test_copy.py
Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst [new file with mode: 0644]

index f86040a33c55478b5fdcdf377c03616e39373b24..e634c43e347b9fa35b63db84370cd9fb378d031c 100644 (file)
@@ -111,7 +111,7 @@ _copy_dispatch = d = {}
 def _copy_immutable(x):
     return x
 for t in (type(None), int, float, bool, complex, str, tuple,
-          bytes, frozenset, type, range, slice,
+          bytes, frozenset, type, range, slice, property,
           types.BuiltinFunctionType, type(Ellipsis), type(NotImplemented),
           types.FunctionType, weakref.ref):
     d[t] = _copy_immutable
@@ -206,6 +206,7 @@ d[type] = _deepcopy_atomic
 d[types.BuiltinFunctionType] = _deepcopy_atomic
 d[types.FunctionType] = _deepcopy_atomic
 d[weakref.ref] = _deepcopy_atomic
+d[property] = _deepcopy_atomic
 
 def _deepcopy_list(x, memo, deepcopy=deepcopy):
     y = []
index 45a692022f29bc09019dcd99ab4a77ce01acdd47..35f72fb216b64a79cfce45e39b48f35e79b44514 100644 (file)
@@ -99,7 +99,7 @@ class TestCopy(unittest.TestCase):
                  42, 2**100, 3.14, True, False, 1j,
                  "hello", "hello\u1234", f.__code__,
                  b"world", bytes(range(256)), range(10), slice(1, 10, 2),
-                 NewStyle, Classic, max, WithMetaclass]
+                 NewStyle, Classic, max, WithMetaclass, property()]
         for x in tests:
             self.assertIs(copy.copy(x), x)
 
@@ -357,7 +357,7 @@ class TestCopy(unittest.TestCase):
             pass
         tests = [None, 42, 2**100, 3.14, True, False, 1j,
                  "hello", "hello\u1234", f.__code__,
-                 NewStyle, Classic, max]
+                 NewStyle, Classic, max, property()]
         for x in tests:
             self.assertIs(copy.deepcopy(x), x)
 
diff --git a/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst b/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst
new file mode 100644 (file)
index 0000000..0b19551
--- /dev/null
@@ -0,0 +1 @@
+Add :func:`copy.copy` and :func:`copy.deepcopy` support to :func:`property` objects.
\ No newline at end of file