把当前类的返回类型注释[复制](putting current class as return ty

2019-08-20 01:44发布

这个问题已经在这里有一个答案:

  • 如何指定一个方法的返回类型是相同的类本身在Python? 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

问题是我不能做的批注与当前类(图),这是没有定义的返回类型。 例:

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

此代码去与错误

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

这些注释都用于记录,并允许IDE识别参数和返回值的类型=>启用自动完成真正有用的

UPD:所以我想出了是,这是不可能的或者需要一些黑客,我不喜欢,所以我决定只使用def reverse (self) -> 'Graph':这是可以理解的文档虽然违反规则。 缺点是,它不支持IDE自动完成工作。

Answer 1:

所以,现在一段时间后,我可以说,我决定了,用-> 'Graph' ,而不是-> Graph 。 它不会让我的IDE(PyCharm)能够识别一类这种方式,但它只是工作得很好证明以作记录。

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

这个问题在识别实际上是定义在上课前类对象根。 这是根本不可能在Python做。



Answer 2:

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


文章来源: putting current class as return type annotation [duplicate]