根据PEP 526 --变量注释的语法,您可以做注释来注释这样的函数:
def comment():
num: int = 5
print ('COMMENTS', __annotations__)
那为什么这个不起作用?
>>> comment()
COMMENTS {}
发布于 2019-10-17 03:14:59
如果您阅读您所链接的PEP,您将发现以下文本:
注释局部变量将导致解释器将其视为本地变量,即使从未分配给它。局部变量的注释不会被计算为: def ():x: NonexistentName #无错误。 但是,如果是在模块或类级别,则将对类型进行评估: x: NonexistentName #错误!类X: var: NonexistentName # Error! 此外,在模块或类级别的中,如果要注释的项是一个简单的名称,那么它和注释将存储在该模块或类的
__annotations__
属性中(如果是私有的),作为从名称到求值注释的有序映射。下面是一个示例: 输入导入Dict类播放器:.玩家: Dictstr,Player __points: int print(__annotations__) # prints:{‘Player’:typing.Dictstr,__main__.Player,# '_Player__points':}
局部变量注释不求值,也不存储在__annotations__
dict中。实际上,局部变量根本没有__annotations__
dicts;您正在为模块全局打印__annotations__
。
发布于 2019-10-17 03:13:38
你应该阅读佩普526的全文(强调我的):
注意,如果没有静态地找到注释,那么根本就不会创建
__annotations__
字典。此外,在本地提供注释的价值并不能抵消在每个函数调用中创建和填充注释字典的成本。因此,函数级的注释不进行评估,也不存储.。
发布于 2019-10-17 03:19:20
注释局部变量将导致解释器将其视为本地变量,即使从未分配给它。将不计算局部变量的注释。
和
注意,如果没有静态地找到注释,那么根本就不会创建注释字典。此外,在本地提供注释的价值并不能抵消在每个函数调用中创建和填充注释字典的成本。因此,函数级的注释不会被评估和存储。
https://stackoverflow.com/questions/58424301
复制相似问题