Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么是变量注释?_Python_Python 3.x_Annotations_Type Hinting_Python 3.6 - Fatal编程技术网

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解释器不向变量注释附加任何特定含义,只将它

Python3.6即将发布。提到12月底,所以我仔细查看了他们提到的变量注释:

介绍了功能参数类型注释的标准,也称为类型提示。此PEP为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
属性对其进行内省。您可以将任意信息附加到这些注释中,但不严格限于键入提示信息

你可能想读这本书;它包含一些新语法之外的附加功能;例如,它指定何时评估此类注释、如何内省它们以及如何将某些内容声明为类属性与实例属性

什么是变量注释

变量注释只是
#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)
随着新语法的出现,还引入了其他更改;模块和类现在有一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
属性(函数从那时起就有了),其中附加

from typing import get_type_hints  # grabs __annotations__
现在,
\uuuuuuu main\uuuuu.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

>>> from typing import List, get_type_hints
>>> primes: List[int] = []
>>> captain: str
>>> import __main__
>>> get_type_hints(__main__)
{'primes': typing.List<~T>[int]}
使用
print(\uuuuu annotations\uuuuu)
将显示
'captain':
,但您确实不应该直接访问
\uuuu annotations\uuuuu

同样,对于类:

>>> get_type_hints(Starship)
ChainMap({'stats': typing.Dict<~KT, ~VT>[str, int]}, {})
>>获取类型提示(星际飞船)
链图({'stats':typing.Dict[str,int]},{})
其中,
ChainMap
用于获取给定类(位于第一个映射中)的注释以及在其
mro
中找到的基类中定义的所有注释(对象的后续映射,
{}

除了新语法之外,还添加了一个新类型来表示类变量。是的,在您的示例中,
stats
实际上是一个实例变量,而不是
ClassVar

我会被迫使用它吗


与来自
PEP 484
的类型提示一样,这些提示是完全可选的,主要用于类型检查工具(以及基于此信息可以构建的任何其他工具)。当Python3.6的稳定版本发布时,它是临时的,因此将来可能会添加一些小的调整。

类型提示不进行任何类型检查<代码>素数:列表[int]=[]
素数=[]
一样只是一个空列表。不同之处在于,您声称
primes
仅包含
int
s,第三方应用程序可能会键入check以验证此声明,但当您在任何python解释器中运行代码时,这与编写
primes=[]
完全相同,因此执行
primes:List[int]=[];primes.append(“string”)
仍然有效。@Bakuriu是的,很好。正如Jim Fasarakis Hilliard在他的回答中所描述的,为什么要输入提示→ 帮助类型检查,帮助文档和IDE
>>> get_type_hints(Starship)
ChainMap({'stats': typing.Dict<~KT, ~VT>[str, int]}, {})