Python注释:指的是类吗?
Python注释:指的是类吗?
在Python 3中,我可以使用参数和返回类型注释。例如:\n
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
\n问题是我不能使用返回类型为当前类(Graph)的注释,因为该类尚未定义。\n例如:\n
class Graph: def reverse(self) -> Graph: pass
\n这段代码会报错:\n
def reverse(self) -> Graph: NameError: name 'Graph' is not defined
\n这些注释非常有用,既可以用于文档编写,又可以让IDE识别参数和返回类型,从而启用自动补全功能。\n更新:\n所以我得出的结论是,这要么是不可能的,要么需要一些我不喜欢的技巧,所以我决定只使用 `def reverse (self) -> \'Graph\'` 这样的写法,虽然违反了规则,但在文档中可以理解。不足之处是它不适用于IDE的自动补全功能。
Python注解是一种在代码中添加类型提示的方式。然而,在使用Python注解时,有时会遇到一些问题,比如IDE无法识别类型或者文档中的类型声明不正确。本文将探讨这个问题的原因以及解决方法。
问题的根源在于在类定义之前就尝试识别类对象,这在Python中是不可能的。因此,当我们在注解中使用类名时,IDE可能无法正确地识别类型。
解决这个问题的一种方法是使用字符串表示类名,而不是直接使用类名。例如,可以使用-> 'Graph'
代替-> Graph
。这种方式虽然无法让IDE正确识别类型,但对于文档目的来说已经足够了。
另一种可能的解决方法是在运行时更改注解,但这并不能解决文档中的问题,因为我们不希望在代码中间查找类型声明。
实际上,这是一种正确的解决方案,解决了一个称为前向引用的问题。在撰写本评论时,PyCharm(当前版本)已经能够识别这种类型的注解,并提供了所需的支持。
更新至2020年,PyCharm现在可以识别-> 'Graph'
格式的类型注解,可以使用CMD+单击进行定义跳转等操作。
Python注解是一种在函数定义时提供元数据的方式。然而,在Python 3.7之前,注解在函数定义时会被立即评估,这可能导致一些问题。为了解决这个问题,Python 3.7引入了"Postponed Evaluation of Annotations",即推迟对注解的评估。
在Python 3.7中,注解不再在函数定义时被评估,而是以字符串形式保存在`__annotations__`中。这样做的好处是可以避免一些由于注解评估顺序引起的问题。
然而,需要注意的是,从Python 3.7开始,如果想要使用这个功能,需要使用`__future__`导入才能正常使用,并且不会引发警告。在Python 3.8中,如果在没有`__future__`导入的模块中使用类型注解,编译器会引发`PendingDeprecationWarning`警告。从Python 3.9开始,警告升级为`DeprecationWarning`。在Python 4.0中,这将成为默认行为,不再支持与此PEP不兼容的注解。
下面是一个示例,展示了如何使用`__future__`导入和类型注解:
from __future__ import annotations class C: def func(cls, arg: str) -> C: pass c = C()
通过以上的说明,我们了解到了Python注解在函数定义时的评估问题以及解决方法。同时,我们也知道了从Python 3.7开始,为了使用这个功能,需要进行相应的导入操作,并且在未来的版本中,对于不兼容该PEP的注解将不再受支持。