将当前类作为返回类型注释

在 python 3中,我可以创建参数并返回类型注释:

class Graph:
def __init__(self, V: int, E: int, edges: list):
pass


@classmethod
def fromfile(cls, readobj: type(sys.stdin)):
pass


def V(self) -> int:
pass


def E(self) -> int:
pass

问题是我不能使用当前类(Graph)的返回类型进行注释,因为它还没有定义。 例如:

class Graph:
def reverse(self) -> Graph:
pass

这个代码有错误

def reverse(self) -> Graph:
NameError: name 'Graph' is not defined

这些注释对于编写文档和允许 IDE 识别参数和返回类型 = > 启用自动完成都非常有用

UPD: 所以我想到的是,这要么是不可能的,要么需要一些我不喜欢的技巧,所以我决定只使用 def reverse (self) -> 'Graph': 这对于文档来说是可以理解的,尽管它违反了规则。

42729 次浏览

所以现在过了一段时间,我可以说我的决定是使用 -> 'Graph'而不是 -> Graph。它并不能使我的 IDE (PyCharm)以这种方式识别类型,但是对于文档来说,它已经足够好了。

我可以使用的另一个可能的解决方案是在运行时更改注释,但这并不能解决文档的问题——您不会希望在源代码的中间寻找类型声明..。

这个问题的根源在于在实际定义类之前识别类对象。在 python 中根本不可能做到这一点。

在 python-3.7中,这个问题已经通过在函数定义时不评估注释得到了解决。相反,它们以字符串形式保存在 __annotations__中。这被称为 延迟评估注释,在 PEP 563中引入。

还要注意:

折旧政策

从 Python 3.7开始,需要一个 __future__导入来使用 没有引发警告。

在 Python 3.8中,编译器在 在没有 __future__的模块中存在类型注释 进口。

从 Python 3.9开始,警告变成了 DeprecationWarning

在 Python 4.0中,这将成为默认行为 不再支持与此 PEP 不兼容的注释。

这里有一个例子:

In [7]: from __future__ import annotations


In [8]: class C:
...:     def func(cls, arg:str) -> C:
...:         pass
...:


In [9]: c = C()