我试图实现一个图的节点和边。这是我的密码:
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
还引用了节点
。
我怎样才能让它工作?
您可以使用字符串文字;稍后将对它们进行评估:
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]
使用字符串文字。
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约束。更不用说实际制造(或发声)它们了- 这会贵得多。 资料模型 首先,我清理了您的数据模型: 不要使用非描述性的