当前位置: 首页 > 知识库问答 >
问题:

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

岳鸿畴
2023-03-14

在Python3中,我可以创建参数和返回类型注释。例子:

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


共有2个答案

蒋斯伯
2023-03-14

所以过了一会儿,我可以说我的决定是使用-

我可以使用的另一个可能的解决方案是在运行时更改注释,但这不能解决文档问题——您不希望在源代码中的某个地方寻找类型声明。

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

赫连实
2023-03-14

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

另请注意:

弃用政策

从Python3.7开始,使用所描述的功能需要导入\uuuuuuuuuuuuuuuu。没有提出任何警告。

在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()
 类似资料:
  • 问题内容: 在python 3中,我可以设置参数并返回类型注释。例: 问题是我无法使用当前类(图形)的返回类型进行注释,该类型尚未定义。例: 这段代码有错误 这些注释对于记录文档以及允许IDE识别参数和返回类型都非常有用=>启用自动完成功能 UPD:所以我想到的是这是不可能的,或者需要一些我不喜欢的技巧,所以我决定使用 可以理解的文档,尽管这违反了规则。缺点是它不适用于IDE自动完成功能。 问题答

  • 如果我有以下代码 首先,这甚至是可能的,因为它编译得很好。但是我不能使用中的方法执行操作: makeCan是否不同时返回Can和PromotionalCan?如果是这样,当返回PromotionalCan时,如何对变量进行操作?谢谢 编辑:PromotionalCan继承自Can,第二种方法是在PromotionalCan中

  • 我有一个任务,我们要创造一个石头,纸,剪刀的游戏。它指定我们必须创建一个抽象的“工具”类,其中有三个子类:“ToolRock”、“ToolPaper”、“ToolScissors”。抽象类应该有一个“+getFeagnet():tool”函数(用斜体写成)。 我的假设是做一个像这样的抽象函数: RockTool类被指定为具有函数“+get弱点():tool”(不是用斜体写的),我的想法是创建一个覆

  • 我正试图从使用observable转换下面的observable代码。使用可管道操作符创建到。 我已经尝试了下面的方法,但是我得到了一个转换错误,无法转换可观察的类型。看不见的。如有任何帮助,我们将不胜感激。

  • 现在我学习Java已经有一段时间了,但有一个概念我很难理解。我习惯了这样的方法 我知道上面的方法会返回一个整数或字符串,无论你想要什么数据类型 现在我在问自己,上述方法的回报类型到底是什么。我如何使用返回的东西做其他事情? 我还看到人们将对象作为这样的参数传递给方法 这又是怎么回事?在什么情况下,上述“风格”是必要的,需要避免什么陷阱? 使用对象而不是整数之类的值让我感到困惑。