当前位置: 首页 > 知识库问答 >
问题:

Python 3.6中的相互递归类型,使用命名元组语法[duplicate]

谷永贞
2023-03-14

我试图实现一个图的节点和边。这是我的密码:

from typing import NamedTuple, List

class Node(NamedTuple):
    name: str
    edges: List[Edge]

class Edge(NamedTuple):
    src: Node
    dest: Node

这会引发一个错误,因为在创建节点时未定义边缘类型。

NameError: name 'Edge' is not defined

切换定义不起作用,因为Edge还引用了节点

我怎样才能让它工作?

共有2个答案

乔伯寅
2023-03-14

您可以使用字符串文字;稍后将对它们进行评估:

class Node(NamedTuple):
    name: str
    edges: List['Edge']

请参阅PEP 484的向前引用部分-类型提示:

当类型提示包含尚未定义的名称时,该定义可以表示为字符串文本,稍后进行解析。

对于NamedTuple对象,前向引用被显式存储,以供以后取消引用:

>>> Node._field_types
{'name': <class 'str'>, 'edges': typing.List[_ForwardRef('Edge')]}

类型检查器稍后可以从局部变量和全局变量中取消引用的对象:

>>> typing._eval_type(Node._field_types['edges'], globals(), locals())
typing.List[__main__.Edge]
有翰海
2023-03-14

使用字符串文字。

from typing import NamedTuple, List

class Node(NamedTuple):
    name: str
    edges: List['Edge']

class Edge(NamedTuple):
    src: Node
    dest: Node

详情见PEP-484中的“转发参考”部分:

当类型提示包含尚未定义的名称时,该定义可以表示为字符串文本,稍后进行解析。

 类似资料:
  • 假设我编写这样的代码: 我如何让Kotlin优化这些相互递归的函数,以便在不抛出StackOverflower错误的情况下运行main?tailrec关键字适用于单函数递归,但没有更复杂的功能。我还看到一个警告,在使用关键字tailrec的地方没有找到尾部调用。也许这对编译器来说太难了?

  • 问题内容: 我的一个朋友在Java API(https://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html)中找到了这个窍门, 并通过阅读以下文章https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html我可以理解上述行在语法上的含义,但是从给出的示例中我无法弄清

  • 我的一个朋友在Java API中发现了这条新闻(https://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html), 通过阅读以下文章https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html我可以理解前面提到的这一行在语法上意味着什么,但从给出的示例中,我无法找出

  • 我正在制作一种强类型的玩具函数式编程语言。它使用Hindley Milner算法作为类型推断算法。 在实现该算法时,我有一个问题,即如何推断相互递归函数的类型。 和是相互递归的函数。现在,当类型检查器推断函数的类型时,它也应该能够推断函数的类型,因为它是一个子表达式。 但是,在那一刻,函数还没有定义。因此,显然,类型检查器甚至不知道函数的存在,以及函数的类型。 真实世界的编译器/Inteprete

  • 问题内容: 在这个问题的上下文中,我将探讨如何实现一种属性或方法,该属性或方法将遍历集合中 所有 嵌套级别。 直观地,这应该起作用: 但是,我们不允许将值强制转换为具有关联类型的协议类型。 所以我想使Element类型更明确,例如: 但这显然要求过多的类型推断器。 现在,我退后一步,决定停止尝试将所有内容合并为一个扩展: 现在可以 编译了 -是的!-但调度已关闭:不会绑定到第二个递归版本,但总是绑

  • 问题内容: 我有一个定义相互递归表的模型: 要实际插入问题,我需要怎么做?我需要知道什么是正确的答案。但是要插入答案,我需要知道答案是什么。 如果有问题,我正在运行Postgres。 DDL为: 问题答案: 如果您使用数据修改CTE在 单个语句中 输入问题和答案,那么您甚至都不需要FK约束。更不用说实际制造(或发声)它们了- 这会贵得多。 资料模型 首先,我清理了您的数据模型: 不要使用非描述性的