在类中键入提示

新手上路,请多包涵
class Node:
    def append_child(self, node: Node):
       if node != None:
        self.first_child = node
    self.child_nodes += [node]

我该怎么做 node: Node ?因为当我运行它时,它说 name 'Node' is not defined

我是否应该只删除 : Node 并在函数内部进行实例检查?但是我怎么能访问 node 的属性(我希望它是 Node 类的实例)?

我不知道如何在 Python 中实现类型转换,顺便说一句。

原文由 Ben Sat 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 394
2 个回答

类型检查中的“self”引用通常使用字符串来完成:

 class Node:
    def append_child(self, node: 'Node'):
       if node != None:
        self.first_child = node
    self.child_nodes += [node]

PEP-0484 的 “前向参考” 部分对此进行了描述。

请注意, 这不会进行任何类型检查 或转换。这是 python(通常)完全忽略1的 _类型提示_。但是,第三方工具(例如 mypy)使用类型提示对您的代码进行静态分析,并可能在运行前产生错误。

此外,从 python3.7 开始,您可以使用 from __future__ import annotations 将所有类型提示 隐式 转换为模块中的字符串(在 python4.0 中,这将是默认设置)。

1提示 是可 自省的——所以如果您真的愿意,您可以使用它们来使用装饰器等构建某种运行时检查器,但 python 默认情况下不会这样做。

原文由 mgilson 发布,翻译遵循 CC BY-SA 4.0 许可协议

Python 3.7 和 Python 4.0 3.10 以上版本

PEP 563 引入了延迟评估,作为字符串存储在 __annotations__ 中。用户可以通过 __future__ 指令启用此功能:

 from __future__ import annotations

这使得可以写:

 class C:
    a: C
    def foo(self, b: C):
        ...

从 Python 3.10(计划于 2021 年 10 月 4 日发布)开始,此行为将成为默认行为。

编辑 2020-11-15 :最初宣布从 Python 4.0 开始强制执行,但现在看来 这将在 Python 3.10 中成为默认设置预计 2021-10-04 。这让我感到惊讶,因为它似乎违反了 __future__ 中的承诺,即在 Python 4.0 之前这种向后兼容性不会被破坏。也许开发人员认为 3.10 不是 4.0,或者他们改变了主意。另请参阅 _为什么注释的 future MandatoryRelease 在 3.7 和 3.8 之间发生变化?_ .

原文由 gerrit 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题