Skip to content

Commit 29584aa

Browse files
bpo-43102: Set namedtuple __new__'s internal builtins to a dict. (GH-24439) (GH-24452)
1 parent 48d16b4 commit 29584aa

3 files changed

Lines changed: 8 additions & 1 deletion

File tree

Lib/collections/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ def namedtuple(typename, field_names, *, rename=False, defaults=None, module=Non
424424

425425
namespace = {
426426
'_tuple_new': tuple_new,
427-
'__builtins__': None,
427+
'__builtins__': {},
428428
'__name__': f'namedtuple_{typename}',
429429
}
430430
code = f'lambda _cls, {arg_list}: _tuple_new(_cls, ({arg_list}))'

Lib/test/test_collections.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,11 @@ class NewPoint(tuple):
680680
self.assertEqual(np.x, 1)
681681
self.assertEqual(np.y, 2)
682682

683+
def test_new_builtins_issue_43102(self):
684+
self.assertEqual(
685+
namedtuple('C', ()).__new__.__globals__['__builtins__'],
686+
{})
687+
683688

684689
################################################################################
685690
### Abstract Base Classes
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
The namedtuple __new__ method had its __builtins__ set to None instead
2+
of an actual dictionary. This created problems for introspection tools.

0 commit comments

Comments
 (0)