首页 > 解决方案 > 注释或注释函数

问题描述

根据PEP 526 -- Syntax for Variable Annotations你可以做注释来注释这样的函数:

def comment():
    num: int = 5
    print ('COMMENTS', __annotations__)

为什么这不起作用呢?

>>> comment()
COMMENTS {}

标签: python

解决方案


如果您阅读您链接的 PEP,您会发现以下文本:

注释局部变量将导致解释器将其视为局部变量,即使它从未被分配给。不会评估局部变量的注释

def f():
    x: NonexistentName  # No error.

但是,如果它在模块或类级别,则将评估类型:

x: NonexistentName  # Error!
class X:
    var: NonexistentName  # Error!

此外,在模块或类级别,如果被注释的项目是一个简单的名称,那么它和注释将__annotations__作为从名称到评估的注释的有序映射存储在该模块或类的属性中(如果私有,则被损坏) . 这是一个例子:

from typing import Dict
class Player:
    ...
players: Dict[str, Player]
__points: int

print(__annotations__)
# prints: {'players': typing.Dict[str, __main__.Player],
#          '_Player__points': <class 'int'>}

局部变量注释不被评估,也不存储在__annotations__字典中。事实上,根本没有__annotations__局部变量的字典;您正在__annotations__为模块全局变量打印。


推荐阅读