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

时间:2013-04-06 16:48:29

标签: class python-3.x annotations

在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': 这虽然打破了规则,但对文档来说是可以理解的。缺点是它不适用于IDE自动完成。

2 个答案:

答案 0 :(得分:52)

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

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

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

答案 1 :(得分:25)

在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()