什么是变量注释?
变量注释只是注释中的下一步# type
,因为它们是在PEP 484
;中定义的。PEP 526的相应部分重点介绍了此更改的原理。
因此,与其使用以下类型来提示类型:
primes = []
引入了新的语法,以允许使用形式的赋值直接注释类型:
primes: List[int] = []
正如@Martijn指出的那样,typing
它使用可用的类型并将其初始化为空列表来表示整数列表。
它带来什么变化?
引入的第一个更改是新的语法,该语法使您可以使用类型来注释名称,该名称可以在:
字符后单独添加,也可以选择注释,同时还为其分配值:
annotated_assignment_stmt ::= augtarget ":" expression ["=" expression]
因此,有问题的示例:
primes: List[int] = [ ]
还引入了其他更改以及新语法。模块和类现在具有__annotations__
属性(就像自PEP 3107-Function Annotations以来的功能一样),该属性中附加了类型元数据:
from typing import get_type_hints
现在__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时,它将是临时的,因此将来可能会添加一些小的调整。
primes: List[int] = []
只是一个空列表primes = []
。所不同的是,你声称那primes
是为了只包含int
S和第三方应用程序可能键入检查程序,以验证这种说法,但是当你运行任何Python解释这只是一样写代码primes = []
,从而做primes: List[int] = []; primes.append("string")
仍然是有效。