Python注释:指的是类吗?

8 浏览
0 Comments

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的自动补全功能。

0
0 Comments

Python注解是一种在代码中添加类型提示的方式。然而,在使用Python注解时,有时会遇到一些问题,比如IDE无法识别类型或者文档中的类型声明不正确。本文将探讨这个问题的原因以及解决方法。

问题的根源在于在类定义之前就尝试识别类对象,这在Python中是不可能的。因此,当我们在注解中使用类名时,IDE可能无法正确地识别类型。

解决这个问题的一种方法是使用字符串表示类名,而不是直接使用类名。例如,可以使用-> 'Graph'代替-> Graph。这种方式虽然无法让IDE正确识别类型,但对于文档目的来说已经足够了。

另一种可能的解决方法是在运行时更改注解,但这并不能解决文档中的问题,因为我们不希望在代码中间查找类型声明。

实际上,这是一种正确的解决方案,解决了一个称为前向引用的问题。在撰写本评论时,PyCharm(当前版本)已经能够识别这种类型的注解,并提供了所需的支持。

更新至2020年,PyCharm现在可以识别-> 'Graph'格式的类型注解,可以使用CMD+单击进行定义跳转等操作。

0
0 Comments

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的注解将不再受支持。

0