将当前类作为返回类型注释[重复]

Posted

技术标签:

【中文标题】将当前类作为返回类型注释[重复]【英文标题】:putting current class as return type annotation [duplicate] 【发布时间】:2013-03-29 00:31:40 【问题描述】:

在 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 识别参数和返回类型非常有用 => 启用自动完成

更新: 所以我想这要么是不可能的,要么需要一些我不喜欢的黑客,所以我决定只使用def reverse (self) -> 'Graph': 尽管违反了规则,但这对于文档来说是可以理解的。缺点是它不适用于 IDE 自动完成。

【问题讨论】:

你试过了吗:def reverse(self) -> type(self) @deceze 为什么将旧问题标记为新问题的重复? @Shlomo 因为那里的答案好多了。 【参考方案1】:

在 python-3.7 中,此问题已通过在函数定义时不评估注释来解决。相反,它们以字符串形式保存在__annotations__ 中。这称为 注释的延迟评估,在 PEP 563 中介绍。

另请注意:

弃用政策

从 Python 3.7 开始,需要 __future__ 导入才能使用 描述的功能。不会发出警告。

在 Python 3.8 中,PendingDeprecationWarning 由编译器在 没有__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()

【讨论】:

即使这个问题已经很老了,而且原作者自己回答了我自己,我也会让这个答案成为公认的答案。 这是最好的答案,并提供了正确的用法。【参考方案2】:

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

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

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

【讨论】:

实际上,这是对称为前向引用的问题的正确解决方案 - python.org/dev/peps/pep-0484/#forward-references。并且当前版本的 PyCharm(在撰写此评论时)可以识别出这种类型并提供所有需要的支持。 2020 年更新 - PyCharm 现在可以识别 -> 'Graph' 格式的类型 - 您可以 CMD+单击转到定义等

以上是关于将当前类作为返回类型注释[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用类型提示指定多个类[重复]

Emacs评论/取消评论当前行[重复]

C++转换构造函数:将其它类型转换为当前类的类型

Lua菜鸟②数据类型

显示当前位置的引脚注释

MATLAB在中断时返回当前值[重复]