]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Simplify creation of the __new__ method in namedtuple() (GH-20361)
authorRaymond Hettinger <rhettinger@users.noreply.github.com>
Tue, 26 May 2020 04:39:00 +0000 (21:39 -0700)
committerGitHub <noreply@github.com>
Tue, 26 May 2020 04:39:00 +0000 (21:39 -0700)
Lib/collections/__init__.py

index c4bff592dc0e71d14b9bde675ca92f304bee6e68..011a0c1e7c19d620c778fa165c213eaeffc0ebe0 100644 (file)
@@ -406,11 +406,9 @@ def namedtuple(typename, field_names, *, rename=False, defaults=None, module=Non
 
     # Create all the named tuple methods to be added to the class namespace
 
-    s = f'def __new__(_cls, {arg_list}): return _tuple_new(_cls, ({arg_list}))'
+    s = f'lambda _cls, {arg_list}: _tuple_new(_cls, ({arg_list}))'
     namespace = {'_tuple_new': tuple_new, '__name__': f'namedtuple_{typename}'}
-    # Note: exec() has the side-effect of interning the field names
-    exec(s, namespace)
-    __new__ = namespace['__new__']
+    __new__ = eval(s, namespace)
     __new__.__doc__ = f'Create new instance of {typename}({arg_list})'
     if defaults is not None:
         __new__.__defaults__ = defaults