diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2019-06-26 23:03:08 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-26 23:03:08 +0300 |
commit | 6ef103fbdbc05adbc20838c94b1f0c40fa6c159a (patch) | |
tree | c4d3fb5f5a7283796d361404398f78c0a15dd23c | |
parent | 814c7aefc2b8e9892bce3d59c0ab39563d658aa2 (diff) | |
download | cpython-git-6ef103fbdbc05adbc20838c94b1f0c40fa6c159a.tar.gz |
[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.py | 10 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2019-06-07-08-18-05.bpo-37163.36JkUh.rst | 1 |
2 files changed, 10 insertions, 1 deletions
diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 325b822d9f..8c3d638e86 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 0000000000..5be989736a --- /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". |