变量类型提示在函数内部不验证



执行以下代码:

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

最新更新