为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁星点点滴滴 2019-07-26 17:08:29
什么是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: str和class Starship示例,但不确定最后一个:如何primes: List[int] = []解释?它是否定义了一个只允许整数的空列表?
查看完整描述

2 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

什么是变量注释?

变量注释只是注释的下一步# type,因为它们被定义为PEP 484PEP 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)

还引入了其他更改以及新语法; 模块和类现在具有一个__annotations__属性(如PEP 3107之后的函数 - 函数注释),其中附加了类型元数据:

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]}, {})

其中a ChainMap用于获取给定类(位于第一个映射中)的注释以及在其中找到的基类中定义的所有注释mro(对应的映射{})。

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

我会被迫使用它吗?

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


查看完整回答
反对 回复 2019-07-26
  • 2 回答
  • 0 关注
  • 4451 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信