我正在尝试为图表实现节点和边缘.这是我的代码:
from typing import NamedTuple, List class Node(NamedTuple): name: str edges: List[Edge] class Edge(NamedTuple): src: Node dest: Node
这会引发错误,因为创建Edge
时未定义类型Node
.
NameError: name 'Edge' is not defined
切换定义不起作用,因为Edge
也指Node
.
我怎样才能使它工作?
使用字符串文字.
from typing import NamedTuple, List class Node(NamedTuple): name: str edges: List['Edge'] class Edge(NamedTuple): src: Node dest: Node
详情见PEP-484,在"前向参考"部分下:
当类型提示包含尚未定义的名称时,该定义可以表示为字符串文字,稍后要解决.
你可以使用字符串文字; 他们将在以后评估:
class Node(NamedTuple): name: str edges: List['Edge']
请参阅PEP 484 的前向参考部分 - 类型提示:
当类型提示包含尚未定义的名称时,该定义可以表示为字符串文字,稍后要解决.
对于NamedTuple
对象,显式存储前向引用以供以后解除引用:
>>> Node._field_types {'name':, 'edges': typing.List[_ForwardRef('Edge')]}
类型检查器以后可以从本地和全局变量中取消引用:
>>> typing._eval_type(Node._field_types['edges'], globals(), locals()) typing.List[__main__.Edge]