bpo-43102: Set namedtuple __new__'s internal builtins to a dict. (GH-24439)

This commit is contained in:
Raymond Hettinger 2021-02-04 15:52:16 -08:00 committed by GitHub
parent 196d4deaf4
commit b6d68aa08b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 8 additions and 1 deletions

View File

@ -407,7 +407,7 @@ def namedtuple(typename, field_names, *, rename=False, defaults=None, module=Non
namespace = {
'_tuple_new': tuple_new,
'__builtins__': None,
'__builtins__': {},
'__name__': f'namedtuple_{typename}',
}
code = f'lambda _cls, {arg_list}: _tuple_new(_cls, ({arg_list}))'

View File

@ -681,6 +681,11 @@ class TestNamedTuple(unittest.TestCase):
self.assertEqual(np.x, 1)
self.assertEqual(np.y, 2)
def test_new_builtins_issue_43102(self):
self.assertEqual(
namedtuple('C', ()).__new__.__globals__['__builtins__'],
{})
################################################################################
### Abstract Base Classes

View File

@ -0,0 +1,2 @@
The namedtuple __new__ method had its __builtins__ set to None instead
of an actual dictionary. This created problems for introspection tools.