Python 将当前类作为返回类型注释
在Python3中,我可以创建参数和返回类型注释。例如:Python 将当前类作为返回类型注释,python,python-3.x,class,annotations,Python,Python 3.x,Class,Annotations,在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) ->
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)的返回类型创建注释,该类尚未定义。
例如:
这段代码有错误
def reverse(self) -> Graph:
NameError: name 'Graph' is not defined
这些注释对于记录和允许IDE识别参数和返回类型=>EnableAutoComplete都非常有用
UPD:
所以我想到的是,这要么是不可能的,要么需要一些我不喜欢的技巧,所以我决定只使用def reverse(self)->“Graph”:
这对于文档来说是可以理解的,尽管违反了规则。缺点是它不适用于IDE自动完成。因此,过了一会儿,我可以说我做出的决定是使用
->'Graph'
而不是->Graph
。这并不能使我的IDE(PyCharm)能够以这种方式识别类型,但对于文档而言,它已经足够好了
另一种可能的解决方法是在运行时更改注释,但这不能解决文档中的问题——您不希望在源代码中的某个地方寻找类型声明…
问题的根源在于在实际定义类之前识别类对象。这在python中根本不可能做到。因此,过了一会儿,我可以说我做出的决定是使用
->'Graph'
而不是->Graph
。这并不能使我的IDE(PyCharm)能够以这种方式识别类型,但对于文档而言,它已经足够好了
另一种可能的解决方法是在运行时更改注释,但这不能解决文档中的问题——您不希望在源代码中的某个地方寻找类型声明…
问题的根源在于在实际定义类之前识别类对象。这在python中根本不可能做到。在python-3.7中,通过在函数定义时不评估注释,这个问题已经得到了解决。相反,它们以字符串形式保存在
\uuuu注释中。这称为注释的延迟评估,在中介绍
另请注意:
弃用政策
从Python 3.7开始,使用
描述的功能。没有提出任何警告
在Python 3.8中,编译器在
没有\uuuu future\uuuu
进口
从Python3.9开始,警告变为弃用警告
在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.7中,通过在函数定义时不评估注释,解决了这个问题。相反,它们以字符串形式保存在\uuuu注释中。这称为注释的延迟评估,在中介绍
另请注意:
弃用政策
从Python 3.7开始,使用
描述的功能。没有提出任何警告
在Python 3.8中,编译器在
没有\uuuu future\uuuu
进口
从Python3.9开始,警告变为弃用警告
在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()
您是否尝试过:def reverse(self)->键入(self)
@deceze为什么将旧问题标记为新问题的副本?@Shlomo,因为那里的答案要好得多。您尝试过:def reverse(self)->键入(self)了吗
@deceze为什么要将旧问题标记为新问题的副本?@Shlomo,因为那里的答案要好得多。实际上,这是一个正确的解决方案,可以解决所谓的正向引用问题-。当前版本的PyCharm(在撰写此评论时)识别出了一个以前编写的类型,并提供了所有必要的支持。从2020年开始更新-PyCharm现在可以识别->“Graph”
格式中的类型-您可以CMD+单击转到定义,等等,这是一个被称为正向引用的问题的正确解决方案-。当前版本的PyCharm(在撰写此评论时)识别出了一个以前编写的类型,并提供了所有必要的支持。从2020年开始更新-PyCharm现在可以识别->“Graph”
格式中的类型-您可以通过CMD+单击转到定义,尽管这个问题很老,原作者自己回答了,我还是会让这个答案成为一个公认的答案。这是最好的答案,提供了准确的用法。即使这个问题很老,原作者自己回答了,我也会让这个答案成为一个公认的答案。这是最好的答案,提供了正确的用法正是正确的用法。