Skip to content
9 changes: 9 additions & 0 deletions Lib/test/test_typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -8468,6 +8468,15 @@ class ThisWontWorkEither(NamedTuple):
def name(self):
return __class__.__name__

def test_named_tuple_non_sequence_input(self):
field_names = ["x", "y"]
field_values = [int, int]
Point = NamedTuple("Point", zip(field_names, field_values))
p = Point(1, 2)
self.assertEqual(p.x, 1)
self.assertEqual(p.y, 2)
self.assertEqual(repr(p),"Point(x=1, y=2)")


class TypedDictTests(BaseTestCase):
def test_basics_functional_syntax(self):
Expand Down
3 changes: 1 addition & 2 deletions Lib/typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -3044,8 +3044,7 @@ class Employee(NamedTuple):
"""
types = {n: _type_check(t, f"field {n} annotation must be a type")
for n, t in fields}
field_names = [n for n, _ in fields]
nt = _make_nmtuple(typename, field_names, _make_eager_annotate(types), module=_caller())
nt = _make_nmtuple(typename, types, _make_eager_annotate(types), module=_caller())
nt.__orig_bases__ = (NamedTuple,)
return nt

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
The functional syntax for creating :class:`typing.NamedTuple`
classes now supports passing any :term:`iterable` of fields and types.
Previously, only sequences were supported.
Loading