什么是变量注解?
变量注释只是注释的下一步# 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 - Function Annotations以来所具有的那样):
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]}, {})
其中 aChainMap
用于获取给定类的注释(位于第一个映射中)以及在其中找到的基类中定义的所有注释mro
(后续映射,{}
用于对象)。
除了新语法之外,ClassVar
还添加了一种新类型来表示类变量。是的,stats
在您的示例中实际上是一个实例变量,而不是ClassVar
.
我会被迫使用它吗?
与来自 的类型提示一样PEP 484
,这些都是完全可选的,主要用于类型检查工具(以及您可以基于此信息构建的任何其他工具)。当 Python 3.6 的稳定版本发布时,它将是临时的,因此将来可能会添加一些小的调整。