我认为静态类型确实会让我在 Python 中的生活更轻松,考虑到我通常使用 C 语言工作。我创建了一个像这样的类:
class node(object):
"""
properties, constructor, etc.
"""
def add_outneighbor(self, neighbor: node) -> None:
"""
do stuff
"""
Flake8 告诉我
node
在
add_outneighbor
的定义中是一个未知类型。目前我正在解决
isinstance(arg, type)
的问题,但这似乎违背了类型提示的目的。 有更好的方法吗?
This
是我为了获取有关类型提示的信息而引用的资源,但我找不到任何有关此自引用问题的讨论。
是的,说对了,使用
isinstance
会违背类型提示的目的。好消息是有一种更好的方法来处理 Python 类型提示中的这种自引用类型!
解决方案:使用字符串文字进行前向引用
由于 Python 解释器是按顺序读取代码的,所以在定义
node
类之前,它还不知道
node
类型是什么。为了解决这个问题,可以使用字符串文字对
node
类型进行“前向引用”:
from __future__ import annotations # 可选,但推荐用于 Python 3.7+
class node(object):
"""
属性,构造函数等。
"""
def add_outneighbor(self, neighbor: 'node') -> None:
"""
执行操作
"""
通过将
neighbor: 'node'
中的类型注释放在引号中,告诉类型检查器将其视为字符串文字,直到它稍后可以解析它。
Python 3.7+ 中的改进:从
__future__
导入 annotations
从 Python 3.7 开始,可以通过在文件顶部添加
from __future__ import annotations
来完全避免在类型提示中使用字符串文字。这会导致在运行时评估类型注释,从而允许以更自然的方式使用前向引用。
示例:
from __future__ import annotations
class node:
def add_outneighbor(self, neighbor: node) -> None:
# ... 你的代码 ...
通过使用这些方法,可以利用类型提示,同时仍然在类定义中引用该类本身。
标签:python,python-typing From: 53695453