python-3.x 从__将来__导入注解

rnmwe5a2  于 2023-02-01  发布在  Python
关注(0)|答案(2)|浏览(157)

Python doc __future__
在python doc about __future__中,有一个表格显示注解在3.7.0b1中是“可选的”,在4.0中是“强制的”,但是我仍然可以在3.8.2中使用注解,而不需要导入注解,那么它有什么用呢?

>>> def add_int(a:int, b:int) -> int:
...     return a + b
>>> add_int.__annotations__
{'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}

我怀疑我没有清楚地理解这里“可选”和“强制”的含义

dxpyg8gm

dxpyg8gm1#

Mandatory是一个有趣的单词选择,我猜它意味着它是语言中的默认值,您不必使用from __future__ import annotations来启用它
annotations功能是指PEP 563:推迟注解的求值,这是对现有annotations feature的增强,annotations feature最初是在python 3.0中引入的,在python 3.5中被重新定义为type hints,这就是为什么你的代码可以在python 3.8下工作。
下面是python3.7+中可选的from __future__ import annotations的变化:

class A:
    def f(self) -> A: # NameError: name 'A' is not defined
        pass

但这个管用

from __future__ import annotations

class A:
    def f(self) -> A:
        pass

参见python 3.7中的这一章关于延迟注解的新特性:
由于这个改变破坏了兼容性,新的行为需要在Python 3.7中使用__future__导入在每个模块的基础上启用:
from __future__ import annotations
它将成为Python 3.10* 中的默认值。

  • 在Python 3.10中(当python3.7发布时),它被宣布为默认值,但现在它被移到了更高的版本中
yacmzcpb

yacmzcpb2#

强制性,默认情况下会出现。可选性,需要从from __future__ import annotations语句中“激活

相关问题