什么是变量注释?
- 2024-12-06 08:39:00
- admin 原创
- 83
问题描述:
Python 3.6 即将发布。PEP 494 -- Python 3.6 发布时间表提到 12 月底,所以我查看了Python 3.6 中的新增功能,发现他们提到了变量注释:
PEP 484引入了函数参数类型注释的标准,又称类型提示。此 PEP 为 Python 添加了用于注释变量类型的语法,包括类变量和实例变量:
primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: Dict[str, int] = {}
就像函数注释一样,Python 解释器不会为变量注释赋予任何特定含义,而只会将其存储在
__annotations__
类或模块的特殊属性中。与静态类型语言中的变量声明不同,注释语法的目标是通过抽象语法树和属性为第三方工具和库提供一种简单的指定结构化类型元数据的方法__annotations__
。
因此,从我所读的内容来看,它们是来自 Python 3.5 的类型提示的一部分,如 Python 3.5 中的类型提示是什么中所述。
我遵循captain: str
和class Starship
示例,但不确定最后一个:如何primes: List[int] = []
解释?它是否定义一个只允许整数的空列表?
解决方案 1:
什么是变量注释?
变量注释只是注释的下一步# 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)
除了新语法之外,还引入了其他更改;模块和类现在具有一个属性(自PEP 3107——函数注释__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 的稳定版本发布时,它将是临时的,因此将来可能会添加一些小的调整。
解决方案 2:
:
和之间的所有内容=
都是类型提示,因此primes
确实定义为List[int]
,并且最初设置为空列表(并且stats
最初是一个空字典,定义为Dict[str, int]
)。
List[int]
和Dict[str, int]
不是下一个语法的一部分,但是,这些已经在 Python 3.5 类型提示 PEP 中定义。3.6 PEP 526 –变量注释语法提案仅定义了将相同提示附加到变量的语法;之前您只能使用注释将类型提示附加到变量(例如primes = [] # List[int]
)。
和List
都是泛型类型,表明您有一个具有特定(具体)内容的列表或字典映射Dict
。
对于List
,只有一个“参数”(语法中的元素[...]
),即列表中每个元素的类型。对于Dict
,第一个参数是键类型,第二个参数是值类型。因此,列表中的所有值primes
都是整数,字典中的所有键值对都是对,将字符串映射到整数。stats
`(str, int)`
请参阅typing.List
和typing.Dict
定义、泛型部分以及PEP 483 -类型提示理论。
与函数上的类型提示一样,它们的使用是可选的,并且也被视为注释(前提是有一个对象可以将它们附加到该注释,因此是模块中的全局变量和类上的属性,但不是函数中的局部变量),您可以通过__annotations__
属性进行自省。您可以将任意信息附加到这些注释,而不必严格限制于类型提示信息。
您可能想要阅读完整的提案;它包含一些超出新语法的附加功能;例如,它指定何时评估此类注释、如何自省它们以及如何将某些内容声明为类属性与实例属性。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件