Skip to content

Commit d8102fd

Browse files
committed
Address review (and fix bug)
1 parent e0c88f0 commit d8102fd

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

Lib/test/test_typing.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7519,7 +7519,7 @@ class GenericNamedTuple(NamedTuple, Generic[T]):
75197519

75207520
self.assertEqual(CallNamedTuple.__orig_bases__, (NamedTuple,))
75217521

7522-
def test_setname_called_on_non_members(self):
7522+
def test_setname_called_on_values_in_class_dictionary(self):
75237523
class Vanilla:
75247524
def __set_name__(self, owner, name):
75257525
self.name = name
@@ -7533,6 +7533,15 @@ class Foo(NamedTuple):
75337533
self.assertIsInstance(foo.attr, Vanilla)
75347534
self.assertEqual(foo.attr.name, "attr")
75357535

7536+
class Bar(NamedTuple):
7537+
attr: Vanilla = Vanilla()
7538+
7539+
bar = Bar()
7540+
self.assertEqual(len(bar), 1)
7541+
self.assertIn('attr', Bar._fields)
7542+
self.assertIsInstance(bar.attr, Vanilla)
7543+
self.assertEqual(bar.attr.name, "attr")
7544+
75367545
def test_setname_raises_the_same_as_on_other_classes(self):
75377546
class CustomException(BaseException): pass
75387547

Lib/typing.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2729,17 +2729,23 @@ def __new__(cls, typename, bases, ns):
27292729
for key, val in ns.items():
27302730
if key in _prohibited:
27312731
raise AttributeError("Cannot overwrite NamedTuple attribute " + key)
2732-
elif key not in _special and key not in nm_tpl._fields:
2733-
setattr(nm_tpl, key, val)
2734-
if hasattr(type(val), "__set_name__"):
2732+
elif key not in _special:
2733+
if key not in nm_tpl._fields:
2734+
setattr(nm_tpl, key, val)
2735+
try:
2736+
set_name = type(val).__set_name__
2737+
except AttributeError:
2738+
pass
2739+
else:
27352740
try:
2736-
type(val).__set_name__(val, nm_tpl, key)
2741+
set_name(val, nm_tpl, key)
27372742
except BaseException as e:
27382743
e.add_note(
27392744
f"Error calling __set_name__ on {type(val).__name__!r} "
27402745
f"instance {key!r} in {typename!r}"
27412746
)
27422747
raise
2748+
27432749
if Generic in bases:
27442750
nm_tpl.__init_subclass__()
27452751
return nm_tpl

0 commit comments

Comments
 (0)