如何正确地将对象注释为函数中的变量?下面是示例:
class A():
def funct_one(self, name: str, rec: B) -> None:
...
class B():
...
正如你所看到的,我试着做
发生这种情况是因为在当前版本的Python中,解释器在首次计算签名时解析注释。这意味着此时这些值需要是可解析的。
你要做的被称为"forward reference"。为了使前向引用成为可能,Python正在积极地改变注释解析的方式,并将这项工作转移到以后所有引用都可以解析的时候。
在解析注释之前,值以简单字符串的形式存储。某些库(如mymyy)或工具(如pycharm)今天已经能够处理此问题。
你有三个选择:
- 重构以避免前向引用
- 在定义注释 时显式地使用字符串
- 使用
__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__
。