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

问题描述 投票:0回答:2

在 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 自动完成功能。

python python-typing
2个回答
155
投票

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

所以现在过了一段时间我可以说我做出的决定是使用 
-> 'Graph'

91
投票
-> Graph

。它并不能让我的 IDE (PyCharm) 能够以这种方式识别类型,但它对于文档目的来说已经足够好了。


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

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

© www.soinside.com 2019 - 2024. All rights reserved.