blob: 2ca12a21e6a8a06fb730e73a42c7230ae7151594 [file] [log] [blame] [edit]
-- 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