2 回答
TA贡献1864条经验 获得超2个赞
什么是变量注释?
变量注释只是注释的下一步# type
,因为它们被定义为PEP 484
; PEP 526的相应部分强调了这一变化背后的基本原理。
所以,而不是暗示类型:
primes = [] # type: List[int]
引入了新语法以允许使用表单赋值直接注释类型:
primes: List[int] = []
正如@Martijn指出的那样,typing
它通过使用可用的类型并将其初始化为空列表来表示整数列表。
它带来了什么变化?
引入的第一个更改是新语法,允许您使用类型注释名称,可以在:
字符后单独添加,也可以选择注释,同时为其指定值:
annotated_assignment_stmt ::= augtarget ":" expression ["=" expression]
所以有问题的例子:
primes: List[int] = [ ]# ^ ^ ^# augtarget | |# expression |# expression (optionally initialize to empty list)
还引入了其他更改以及新语法; 模块和类现在具有一个__annotations__
属性(如PEP 3107之后的函数 - 函数注释),其中附加了类型元数据:
from typing import get_type_hints # grabs __annotations__
现在__main__.__annotations__
保存声明的类型:
>>> from typing import List, get_type_hints>>> primes: List[int] = []>>> captain: str>>> import __main__>>> get_type_hints(__main__){'primes': typing.List<~T>[int]}
captain
目前不会显示,get_type_hints
因为get_type_hints
只返回模块上也可以访问的类型; 即,它首先需要一个值:
>>> captain = "Picard">>> get_type_hints(__main__){'primes': typing.List<~T>[int], 'captain': <class 'str'>}
使用print(__annotations__)
会显示,'captain': <class 'str'>
但你真的不应该__annotations__
直接访问。
同样,对于类:
>>> get_type_hints(Starship)ChainMap({'stats': typing.Dict<~KT, ~VT>[str, int]}, {})
其中a ChainMap
用于获取给定类(位于第一个映射中)的注释以及在其中找到的基类中定义的所有注释mro
(对应的映射{}
)。
除了新语法之外,ClassVar
还添加了一个新类型来表示类变量。是的,stats
在你的例子中实际上是一个实例变量,而不是一个ClassVar
。
我会被迫使用它吗?
与类型提示一样PEP 484
,这些是完全可选的,主要用于类型检查工具(以及基于此信息可以构建的任何其他工具)。当发布稳定版本的Python 3.6时,它将是临时的,因此将来可能会添加一些小的调整。
添加回答
举报