Python 什么是变量注释?
Python3.6即将发布。提到12月底,所以我仔细查看了他们提到的变量注释: 介绍了功能参数类型注释的标准,也称为类型提示。此PEP为Python添加了语法,用于注释变量类型,包括类变量和实例变量:Python 什么是变量注释?,python,python-3.x,annotations,type-hinting,python-3.6,Python,Python 3.x,Annotations,Type Hinting,Python 3.6,Python3.6即将发布。提到12月底,所以我仔细查看了他们提到的变量注释: 介绍了功能参数类型注释的标准,也称为类型提示。此PEP为Python添加了语法,用于注释变量类型,包括类变量和实例变量: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: Dict[str, int] = {} 与函数注释一样,Python解释器不向变量注释附加任何特定含义,只将它
primes: List[int] = []
captain: str # Note: no initial value!
class Starship:
stats: Dict[str, int] = {}
与函数注释一样,Python解释器不向变量注释附加任何特定含义,只将它们存储在类或模块的特殊属性\uuuuuu annotations\uuuuu
中。与静态类型语言中的变量声明不同,注释语法的目标是通过抽象语法树和\uuuu annotations\uu
属性为第三方工具和库提供一种简单的指定结构化类型元数据的方法
因此,从我阅读的内容来看,它们是来自Python 3.5的类型提示的一部分,如中所述
我遵循
船长:str
和类星际飞船
的例子,但不确定最后一个例子:primes:List[int]=[]
如何解释?它定义了一个只允许整数的空列表吗?在:
和=
之间的所有内容都是一个类型提示,因此素数实际上定义为list[int]
,并且最初设置为空列表(而stats
最初是一个空字典,定义为Dict[str,int]
)
List[int]
和Dict[str,int]
不是下一个语法的一部分,但是,它们已经在Python 3.5键入提示PEP中定义。3.6提案仅定义了将相同提示附加到变量的语法;之前,您只能将类型提示附加到带有注释的变量(例如,primes=[]#List[int]
)
List
和Dict
都是泛型类型,表示您拥有具有特定(具体)内容的列表或词典映射
对于List
,只有一个“参数”([…]
语法中的元素),即列表中每个元素的类型。对于Dict
,第一个参数是键类型,第二个参数是值类型。因此primes
列表中的所有值都是整数,stats
字典中的所有键值对都是(str,int)
对,将字符串映射到整数
请参见和定义、以及
与函数上的类型提示一样,它们的使用是可选的,并且也被视为注释(前提是有一个对象要附加这些对象,所以模块中的全局变量和类上的属性,而不是函数中的局部变量),您可以通过\uuuuu annotations\uuuu
属性对其进行内省。您可以将任意信息附加到这些注释中,但不严格限于键入提示信息
你可能想读这本书;它包含一些新语法之外的附加功能;它指定何时评估此类注释,如何内省它们,以及如何将某些内容声明为类属性与实例属性,例如。介于:
和=
之间的所有内容都是类型提示,因此primes
确实定义为列表[int]
,并且最初设置为空列表(而stats
最初是一个空字典,定义为Dict[str,int]
)
List[int]
和Dict[str,int]
不是下一个语法的一部分,但是,它们已经在Python3.5类型提示PEP中定义。3.6建议只定义了将相同提示附加到变量的语法;在此之前,您只能将类型提示附加到带有注释的变量(例如primes=[]#List[int]
)
List
和Dict
都是泛型类型,表示您拥有具有特定(具体)内容的列表或词典映射
对于列表
,只有一个“参数”([…]
语法中的元素),列表中每个元素的类型。对于Dict
,第一个参数是键类型,第二个参数是值类型。因此primes
列表中的所有值都是整数,stats
字典中的所有键值对都是(str,int)
对,将字符串映射到整数
请参见和定义、以及
与函数上的类型提示一样,它们的使用是可选的,也被视为注释(前提是有一个对象将它们附加到,因此模块中的全局变量和类中的属性,而函数中的局部变量除外)您可以通过\uuuuuu annotations\uuuu
属性对其进行内省。您可以将任意信息附加到这些注释中,而不限于键入提示信息
您可能需要阅读;它包含一些新语法之上和之外的附加功能;它指定何时评估此类注释,如何对它们进行内省,以及如何将某些内容声明为类属性与实例属性,例如
什么是变量注释
变量注释只是#type
注释的下一步,正如它们在PEP 484
中定义的那样;此更改背后的基本原理在
因此,与其暗示类型为:
primes = [] # type: List[int]
引入了新的语法,以允许使用形式赋值直接注释类型:
primes: List[int] = []
正如@Martijn所指出的,它通过使用中可用的类型并将其初始化为空列表来表示整数列表
它带来了什么变化
引入的第一个更改是,允许您在:
字符后面单独添加一个类型来注释名称,或者在为名称指定值的同时选择性地添加注释:
annotated_assignment_stmt ::= augtarget ":" expression ["=" expression]
因此,有问题的例子是:
primes: List[int] = [ ]
# ^ ^ ^
# augtarget | |
# expression |
# expression (optionally initialize to empty list)
随着新语法的引入,还引入了其他更改;模块和类现在都有了新的语法
from typing import get_type_hints # grabs __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 = "Picard"
>>> get_type_hints(__main__)
{'primes': typing.List<~T>[int], 'captain': <class 'str'>}
>>> get_type_hints(Starship)
ChainMap({'stats': typing.Dict<~KT, ~VT>[str, int]}, {})