@@ -68,6 +68,7 @@ class Mapping(Generic[_K, _V]): ...
6868class Match(Generic[AnyStr]): ...
6969class Sequence(Iterable[_T_co]): ...
7070class Tuple(Sequence[_T_co]): ...
71+ class NamedTuple(tuple[Any, ...]): ...
7172def overload(func: _T) -> _T: ...
7273"""
7374
@@ -82,6 +83,7 @@ def overload(func: _T) -> _T: ...
8283class object:
8384 __module__: str
8485 def __init__(self) -> None: pass
86+ def __repr__(self) -> str: pass
8587class type: ...
8688
8789class tuple(Sequence[T_co], Generic[T_co]): ...
@@ -1599,6 +1601,72 @@ class Y(TypedDict):
15991601 error = None ,
16001602 )
16011603
1604+ @collect_cases
1605+ def test_named_tuple (self ) -> Iterator [Case ]:
1606+ yield Case (
1607+ stub = "from typing import NamedTuple" ,
1608+ runtime = "from typing import NamedTuple" ,
1609+ error = None ,
1610+ )
1611+ yield Case (
1612+ stub = """
1613+ class X1(NamedTuple):
1614+ bar: int
1615+ foo: str = ...
1616+ """ ,
1617+ runtime = """
1618+ class X1(NamedTuple):
1619+ bar: int
1620+ foo: str = 'a'
1621+ """ ,
1622+ error = None ,
1623+ )
1624+ yield Case (
1625+ stub = """
1626+ class X2(NamedTuple):
1627+ bar: int
1628+ foo: str
1629+ """ ,
1630+ runtime = """
1631+ class X2(NamedTuple):
1632+ bar: int
1633+ foo: str = 'a'
1634+ """ ,
1635+ # `__new__` will miss a default value for a `foo` parameter,
1636+ # but we don't generate special errors for `foo` missing `...` part.
1637+ error = "X2.__new__" ,
1638+ )
1639+
1640+ @collect_cases
1641+ def test_named_tuple_typing_and_collections (self ) -> Iterator [Case ]:
1642+ yield Case (
1643+ stub = "from typing import NamedTuple" ,
1644+ runtime = "from collections import namedtuple" ,
1645+ error = None ,
1646+ )
1647+ yield Case (
1648+ stub = """
1649+ class X1(NamedTuple):
1650+ bar: int
1651+ foo: str = ...
1652+ """ ,
1653+ runtime = """
1654+ X1 = namedtuple('X1', ['bar', 'foo'], defaults=['a'])
1655+ """ ,
1656+ error = None ,
1657+ )
1658+ yield Case (
1659+ stub = """
1660+ class X2(NamedTuple):
1661+ bar: int
1662+ foo: str
1663+ """ ,
1664+ runtime = """
1665+ X2 = namedtuple('X1', ['bar', 'foo'], defaults=['a'])
1666+ """ ,
1667+ error = "X2.__new__" ,
1668+ )
1669+
16021670 @collect_cases
16031671 def test_type_var (self ) -> Iterator [Case ]:
16041672 yield Case (
0 commit comments