什么是Python 3.6中的变量注释?

什么是Python 3.6中的变量注释?

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: strclass Starship示例,但不确定最后一个:如何primes: List[int] = []解释?它是否定义了一个只允许整数的空列表?


繁星点点滴滴
浏览 4452回答 2
2回答

慕斯王

什么是变量注释?变量注释只是注释的下一步# type,因为它们被定义为PEP 484;&nbsp;PEP 526的相应部分强调了这一变化背后的基本原理。所以,而不是暗示类型:primes&nbsp;=&nbsp;[]&nbsp;&nbsp;#&nbsp;type:&nbsp;List[int]引入了新语法以允许使用表单赋值直接注释类型:primes:&nbsp;List[int]&nbsp;=&nbsp;[]正如@Martijn指出的那样,typing它通过使用可用的类型并将其初始化为空列表来表示整数列表。它带来了什么变化?引入的第一个更改是新语法,允许您使用类型注释名称,可以在:字符后单独添加,也可以选择注释,同时为其指定值:annotated_assignment_stmt&nbsp;::=&nbsp;&nbsp;augtarget&nbsp;":"&nbsp;expression&nbsp;["="&nbsp;expression]所以有问题的例子:&nbsp;&nbsp;&nbsp;primes:&nbsp;List[int]&nbsp;=&nbsp;[&nbsp;]#&nbsp;&nbsp;&nbsp;&nbsp;^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^#&nbsp;&nbsp;augtarget&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expression&nbsp;&nbsp;&nbsp;&nbsp;|#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expression&nbsp;(optionally&nbsp;initialize&nbsp;to&nbsp;empty&nbsp;list)还引入了其他更改以及新语法;&nbsp;模块和类现在具有一个__annotations__属性(如PEP 3107之后的函数 - 函数注释),其中附加了类型元数据:from&nbsp;typing&nbsp;import&nbsp;get_type_hints&nbsp;&nbsp;#&nbsp;grabs&nbsp;__annotations__现在__main__.__annotations__保存声明的类型:>>>&nbsp;from&nbsp;typing&nbsp;import&nbsp;List,&nbsp;get_type_hints>>>&nbsp;primes:&nbsp;List[int]&nbsp;=&nbsp;[]>>>&nbsp;captain:&nbsp;str>>>&nbsp;import&nbsp;__main__>>>&nbsp;get_type_hints(__main__){'primes':&nbsp;typing.List<~T>[int]}captain目前不会显示,get_type_hints因为get_type_hints只返回模块上也可以访问的类型;&nbsp;即,它首先需要一个值:>>>&nbsp;captain&nbsp;=&nbsp;"Picard">>>&nbsp;get_type_hints(__main__){'primes':&nbsp;typing.List<~T>[int],&nbsp;'captain':&nbsp;<class&nbsp;'str'>}使用print(__annotations__)会显示,'captain': <class 'str'>但你真的不应该__annotations__直接访问。同样,对于类:>>>&nbsp;get_type_hints(Starship)ChainMap({'stats':&nbsp;typing.Dict<~KT,&nbsp;~VT>[str,&nbsp;int]},&nbsp;{})其中a&nbsp;ChainMap用于获取给定类(位于第一个映射中)的注释以及在其中找到的基类中定义的所有注释mro(对应的映射{})。除了新语法之外,ClassVar还添加了一个新类型来表示类变量。是的,stats在你的例子中实际上是一个实例变量,而不是一个ClassVar。我会被迫使用它吗?与类型提示一样PEP 484,这些是完全可选的,主要用于类型检查工具(以及基于此信息可以构建的任何其他工具)。当发布稳定版本的Python 3.6时,它将是临时的,因此将来可能会添加一些小的调整。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python