这个问题在这里已经有了答案:How do I type hint a method with the type of the enclosure class? (7 个回答) 3 年前关闭。
在 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:所以我想这要么是不可能的,要么需要一些我不喜欢的 hack,所以我决定只使用 def reverse (self) -> 'Graph':
这对于文档来说是可以理解的,尽管它违反了规则。缺点是它不适用于 IDE 自动完成功能。
def reverse(self) -> type(self)
在 python-3.7 中,此问题已通过在函数定义时不评估注释来解决。相反,它们以字符串形式保存在 __annotations__
中。这称为 对注解的延迟评估,在 PEP 563 中进行了介绍。
另请注意:
弃用策略 从 Python 3.7 开始,需要 __future__ 导入才能使用所描述的功能。不会发出警告。在 Python 3.8 中,编译器会在没有 __future__ 导入的模块中存在类型注释的情况下引发 PendingDeprecationWarning。从 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()
所以现在过了一段时间,我可以说我做出的决定是使用 -> 'Graph'
而不是 -> Graph
。它不会使我的 IDE (PyCharm) 能够以这种方式识别类型,但它对于文档目的来说已经足够好了。
我可以使用的另一个可能的解决方案是在运行时更改注释,但这并不能解决文档的问题——你不会想在源代码中间的某个地方寻找类型声明......
该问题的根源在于在实际定义类之前识别类对象。这在python中根本不可能做到。
-> 'Graph'
格式的类型 - 您可以 CMD+Click 转到定义等
不定期副业成功案例分享