执行以下代码:
from typing import Dict
bar: Dict[int, int, int] = dict()
抛出异常TypeError
,并抛出消息Too many parameters for typing.Dict; actual 3, expected 2
。但是当你在函数中定义变量时:
from typing import Dict
def foo():
bar: Dict[int, int, int] = dict()
foo()
这次没有引发异常。这是一个预期的行为还是一个bug?
这是预期的行为,在PEP 526—变量注释语法#类型注释的运行时效果中定义。
注释局部变量将导致解释器将其视为局部变量,即使它从未被赋值。局部变量的注释将不会被计算:
def f(): x: NonexistentName # No error.
但是,如果它是在模块或类级别,则该类型将被求值:
x: NonexistentName # Error! class X: var: NonexistentName # Error!
此外,PEP 563—注释的延迟求值定义了在python 3.7+中使用from __future__ import annotations
可以防止这些注释被求值。
此PEP建议更改函数注释和变量注释,以便它们不再在函数定义时计算。相反,它们以字符串形式保存在__annotations__中。
from __future__ import annotations
from typing import Dict
bar: Dict[int, int, int] = dict() # no errors