Skip to content
Snippets Groups Projects
Commit 24e2855ed095 authored by Eric V. Smith's avatar Eric V. Smith
Browse files

Remove an unnecessary copy of the 'namespace' parameter to make_dataclass(). (GH-25372)

parent b40559f8493e
No related branches found
No related tags found
No related merge requests found
...@@ -1233,10 +1233,7 @@ ...@@ -1233,10 +1233,7 @@
if namespace is None: if namespace is None:
namespace = {} namespace = {}
else:
# Copy namespace since we're going to mutate it.
namespace = namespace.copy()
# While we're looking through the field names, validate that they # While we're looking through the field names, validate that they
# are identifiers, are not keywords, and not duplicates. # are identifiers, are not keywords, and not duplicates.
seen = set() seen = set()
...@@ -1239,8 +1236,9 @@ ...@@ -1239,8 +1236,9 @@
# While we're looking through the field names, validate that they # While we're looking through the field names, validate that they
# are identifiers, are not keywords, and not duplicates. # are identifiers, are not keywords, and not duplicates.
seen = set() seen = set()
anns = {} annotations = {}
defaults = {}
for item in fields: for item in fields:
if isinstance(item, str): if isinstance(item, str):
name = item name = item
...@@ -1249,7 +1247,7 @@ ...@@ -1249,7 +1247,7 @@
name, tp, = item name, tp, = item
elif len(item) == 3: elif len(item) == 3:
name, tp, spec = item name, tp, spec = item
namespace[name] = spec defaults[name] = spec
else: else:
raise TypeError(f'Invalid field: {item!r}') raise TypeError(f'Invalid field: {item!r}')
...@@ -1261,5 +1259,5 @@ ...@@ -1261,5 +1259,5 @@
raise TypeError(f'Field name duplicated: {name!r}') raise TypeError(f'Field name duplicated: {name!r}')
seen.add(name) seen.add(name)
anns[name] = tp annotations[name] = tp
...@@ -1265,4 +1263,9 @@ ...@@ -1265,4 +1263,9 @@
namespace['__annotations__'] = anns # Update 'ns' with the user-supplied namespace plus our calculated values.
def exec_body_callback(ns):
ns.update(namespace)
ns.update(defaults)
ns['__annotations__'] = annotations
# We use `types.new_class()` instead of simply `type()` to allow dynamic creation # We use `types.new_class()` instead of simply `type()` to allow dynamic creation
# of generic dataclassses. # of generic dataclassses.
...@@ -1267,6 +1270,8 @@ ...@@ -1267,6 +1270,8 @@
# We use `types.new_class()` instead of simply `type()` to allow dynamic creation # We use `types.new_class()` instead of simply `type()` to allow dynamic creation
# of generic dataclassses. # of generic dataclassses.
cls = types.new_class(cls_name, bases, {}, lambda ns: ns.update(namespace)) cls = types.new_class(cls_name, bases, {}, exec_body_callback)
# Apply the normal decorator.
return dataclass(cls, init=init, repr=repr, eq=eq, order=order, return dataclass(cls, init=init, repr=repr, eq=eq, order=order,
unsafe_hash=unsafe_hash, frozen=frozen, unsafe_hash=unsafe_hash, frozen=frozen,
match_args=match_args) match_args=match_args)
......
Remove an unneeded copy of the namespace passed to
dataclasses.make_dataclass().
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment