summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2019-06-26 20:03:08 (GMT)
committerGitHub <noreply@github.com>2019-06-26 20:03:08 (GMT)
commit6ef103fbdbc05adbc20838c94b1f0c40fa6c159a (patch)
treec4d3fb5f5a7283796d361404398f78c0a15dd23c
parent814c7aefc2b8e9892bce3d59c0ab39563d658aa2 (diff)
downloadcpython-6ef103fbdbc05adbc20838c94b1f0c40fa6c159a.zip
cpython-6ef103fbdbc05adbc20838c94b1f0c40fa6c159a.tar.gz
cpython-6ef103fbdbc05adbc20838c94b1f0c40fa6c159a.tar.bz2
[3.7] bpo-37163: dataclasses.replace() now supports the field named "obj". (GH-13877) (GH-14405)
(cherry picked from commit f5b89af)
-rw-r--r--Lib/dataclasses.py10
-rw-r--r--Misc/NEWS.d/next/Library/2019-06-07-08-18-05.bpo-37163.36JkUh.rst1
2 files changed, 10 insertions, 1 deletions
diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py
index 325b822..8c3d638 100644
--- a/Lib/dataclasses.py
+++ b/Lib/dataclasses.py
@@ -1202,7 +1202,7 @@ def make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True,
unsafe_hash=unsafe_hash, frozen=frozen)
-def replace(obj, **changes):
+def replace(*args, **changes):
"""Return a new object replacing specified fields with new values.
This is especially useful for frozen classes. Example usage:
@@ -1216,6 +1216,14 @@ def replace(obj, **changes):
c1 = replace(c, x=3)
assert c1.x == 3 and c1.y == 2
"""
+ if len(args) > 1:
+ raise TypeError(f'replace() takes 1 positional argument but {len(args)} were given')
+ if args:
+ obj, = args
+ elif 'obj' in changes:
+ obj = changes.pop('obj')
+ else:
+ raise TypeError("replace() missing 1 required positional argument: 'obj'")
# We're going to mutate 'changes', but that's okay because it's a
# new dict, even if called with 'replace(obj, **my_changes)'.
diff --git a/Misc/NEWS.d/next/Library/2019-06-07-08-18-05.bpo-37163.36JkUh.rst b/Misc/NEWS.d/next/Library/2019-06-07-08-18-05.bpo-37163.36JkUh.rst
new file mode 100644
index 0000000..5be9897
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-06-07-08-18-05.bpo-37163.36JkUh.rst
@@ -0,0 +1 @@
+:func:`dataclasses.replace` now supports the field named "obj".