| -- Semantic analysis of named tuples |
| |
| [case testSimpleNamedtuple] |
| from collections import namedtuple |
| N = namedtuple('N', ['a']) |
| def f() -> N: pass |
| [out] |
| MypyFile:1( |
| ImportFrom:1(collections, [namedtuple]) |
| AssignmentStmt:2( |
| NameExpr(N* [__main__.N]) |
| NamedTupleExpr:2(N, Tuple[Any])) |
| FuncDef:3( |
| f |
| def () -> Tuple[Any, fallback=__main__.N] |
| Block:3( |
| PassStmt:3()))) |
| |
| [case testTwoItemNamedtuple] |
| from collections import namedtuple |
| N = namedtuple('N', ['a', 'xyz']) |
| def f() -> N: pass |
| [out] |
| MypyFile:1( |
| ImportFrom:1(collections, [namedtuple]) |
| AssignmentStmt:2( |
| NameExpr(N* [__main__.N]) |
| NamedTupleExpr:2(N, Tuple[Any, Any])) |
| FuncDef:3( |
| f |
| def () -> Tuple[Any, Any, fallback=__main__.N] |
| Block:3( |
| PassStmt:3()))) |
| |
| [case testTwoItemNamedtupleWithTupleFieldNames] |
| from collections import namedtuple |
| N = namedtuple('N', ('a', 'xyz')) |
| def f() -> N: pass |
| [out] |
| MypyFile:1( |
| ImportFrom:1(collections, [namedtuple]) |
| AssignmentStmt:2( |
| NameExpr(N* [__main__.N]) |
| NamedTupleExpr:2(N, Tuple[Any, Any])) |
| FuncDef:3( |
| f |
| def () -> Tuple[Any, Any, fallback=__main__.N] |
| Block:3( |
| PassStmt:3()))) |
| |
| [case testTwoItemNamedtupleWithShorthandSyntax] |
| from collections import namedtuple |
| N = namedtuple('N', ' a xyz ') |
| def f() -> N: pass |
| [out] |
| MypyFile:1( |
| ImportFrom:1(collections, [namedtuple]) |
| AssignmentStmt:2( |
| NameExpr(N* [__main__.N]) |
| NamedTupleExpr:2(N, Tuple[Any, Any])) |
| FuncDef:3( |
| f |
| def () -> Tuple[Any, Any, fallback=__main__.N] |
| Block:3( |
| PassStmt:3()))) |
| |
| [case testNamedTupleWithItemTypes] |
| from typing import NamedTuple |
| N = NamedTuple('N', [('a', int), |
| ('b', str)]) |
| [out] |
| MypyFile:1( |
| ImportFrom:1(typing, [NamedTuple]) |
| AssignmentStmt:2( |
| NameExpr(N* [__main__.N]) |
| NamedTupleExpr:2(N, Tuple[builtins.int, builtins.str]))) |
| |
| [case testNamedTupleWithTupleFieldNamesWithItemTypes] |
| from typing import NamedTuple |
| N = NamedTuple('N', (('a', int), |
| ('b', str))) |
| [out] |
| MypyFile:1( |
| ImportFrom:1(typing, [NamedTuple]) |
| AssignmentStmt:2( |
| NameExpr(N* [__main__.N]) |
| NamedTupleExpr:2(N, Tuple[builtins.int, builtins.str]))) |
| |
| [case testNamedTupleBaseClass] |
| from collections import namedtuple |
| N = namedtuple('N', ['x']) |
| class A(N): pass |
| [out] |
| MypyFile:1( |
| ImportFrom:1(collections, [namedtuple]) |
| AssignmentStmt:2( |
| NameExpr(N* [__main__.N]) |
| NamedTupleExpr:2(N, Tuple[Any])) |
| ClassDef:3( |
| A |
| TupleType( |
| Tuple[Any, fallback=__main__.N]) |
| BaseType( |
| __main__.N) |
| PassStmt:3())) |
| |
| [case testNamedTupleBaseClass2] |
| from collections import namedtuple |
| class A(namedtuple('N', ['x'])): pass |
| [out] |
| MypyFile:1( |
| ImportFrom:1(collections, [namedtuple]) |
| ClassDef:2( |
| A |
| TupleType( |
| Tuple[Any, fallback=__main__.N@2]) |
| BaseType( |
| __main__.N@2) |
| PassStmt:2())) |
| |
| [case testNamedTupleBaseClassWithItemTypes] |
| from typing import NamedTuple |
| class A(NamedTuple('N', [('x', int)])): pass |
| [out] |
| MypyFile:1( |
| ImportFrom:1(typing, [NamedTuple]) |
| ClassDef:2( |
| A |
| TupleType( |
| Tuple[builtins.int, fallback=__main__.N@2]) |
| BaseType( |
| __main__.N@2) |
| PassStmt:2())) |
| |
| -- Errors |
| |
| [case testNamedTupleWithTooFewArguments] |
| from collections import namedtuple |
| N = namedtuple('N') # E: Too few arguments for namedtuple() |
| |
| [case testNamedTupleWithInvalidName] |
| from collections import namedtuple |
| N = namedtuple(1, ['x']) # E: namedtuple() expects a string literal as the first argument |
| |
| [case testNamedTupleWithInvalidItems] |
| from collections import namedtuple |
| N = namedtuple('N', 1) # E: List or tuple literal expected as the second argument to namedtuple() |
| |
| [case testNamedTupleWithInvalidItems2] |
| from collections import namedtuple |
| N = namedtuple('N', ['x', 1]) # E: String literal expected as namedtuple() item |
| |
| [case testNamedTupleWithUnderscoreItemName] |
| from collections import namedtuple |
| N = namedtuple('N', ['_fallback']) # E: namedtuple() field names cannot start with an underscore: _fallback |
| |
| -- NOTE: The following code works at runtime but is not yet supported by mypy. |
| -- Keyword arguments may potentially be supported in the future. |
| [case testNamedTupleWithNonpositionalArgs] |
| from collections import namedtuple |
| N = namedtuple(typename='N', field_names=['x']) # E: Unexpected arguments to namedtuple() |
| |
| [case testInvalidNamedTupleBaseClass] |
| from typing import NamedTuple |
| class A(NamedTuple('N', [1])): pass # E: Tuple expected as NamedTuple() field |
| class B(A): pass |
| |
| [case testInvalidNamedTupleBaseClass2] |
| |
| class A(NamedTuple('N', [1])): pass |
| class B(A): pass |
| [out] |
| main:2: error: Unsupported dynamic base class "NamedTuple" |
| main:2: error: Name 'NamedTuple' is not defined |