如何正确标注对象变量?



如何正确地将对象注释为函数中的变量?下面是示例:

class A():
def funct_one(self, name: str, rec: B) -> None:
...
class B():
...

正如你所看到的,我试着做,但是它弹出错误。

发生这种情况是因为在当前版本的Python中,解释器在首次计算签名时解析注释。这意味着此时这些值需要是可解析的。

你要做的被称为"forward reference"。为了使前向引用成为可能,Python正在积极地改变注释解析的方式,并将这项工作转移到以后所有引用都可以解析的时候。

在解析注释之前,值以简单字符串的形式存储。某些库(如mymyy)或工具(如pycharm)今天已经能够处理此问题。

你有三个选择:

  1. 重构以避免前向引用
  2. 在定义注释
  3. 时显式地使用字符串
  4. 使用__future__模块启用未来行为

选项1:重新排序类,以便在引用B之前定义它。这并不总是可能的,这取决于布局。

class B:
pass
class A:
def funct_one(self, name: str, rec: B) -> None:
pass

选项2:使用注释的字符串版本。像mypy或pycharm这样的工具将为您解析对实际类的引用。

class A:
def funct_one(self, name: str, rec: "B") -> None:
pass
class B:
pass

选项3:(这是我的首选选项)通过导入未来的注释特性来使用延迟的注释处理。在这种模式下,我们可以很容易地在类型提示中对尚未定义的内容进行前向引用

from __future__ import annotations
class A:
def funct_one(self, name: str, rec: B) -> None:
pass
class B:
pass

警告:一些做注释处理的库依赖于旧的实现,但对于简单的代码,这将工作得很好。这将最终成为python的默认操作方式,并且不需要导入__future__

最新更新