如何在多个别名上定义递归 Python 类型?

2023-11-25

我想要这个逻辑类型结构:

from typing import List, Dict, Union

ObjectType = Dict[str, 'EntryType']
ListType = List['EntryType']
EntryType = Union[str, 'ListType', 'ObjectType']

mypy报告这些错误:

mdl/structure.py:7: error: Cannot resolve name "ObjectType" (possible cyclic definition)
mdl/structure.py:7: error: Cannot resolve name "EntryType" (possible cyclic definition)
mdl/structure.py:8: error: Cannot resolve name "ListType" (possible cyclic definition)
...

有某种方法可以对这种递归数据类型进行编码吗?

我相信我可以内联各个类型,每次输入完整的定义,以允许递归。我宁愿避免这种情况,因为它体积庞大且不太清晰。


递归类型有mypy 尚不支持。尽管我不确定实施工作何时开始,但它们肯定在路线图上。它原定于今年早些时候开始,但语义分析阶段的先决条件重构(这使得干净地支持递归类型所需的大量内部更改)最终花费了比预期更长的时间,所以我不确定新的是什么时间表是。也许在接下来的半年左右的某个时候?

您可以研究的一种可能的替代方法是使用类型字典,它允许您将特定类型分配给某些键。如果您已经提前知道输入字典的结构是什么,那么这尤其有用 - 如果您确切地知道您的 ObjectType 将具有哪些键,以及它们将映射到什么。图书馆喜欢pydantic如果您更喜欢使用对象而不是字典并且不想编写一堆验证逻辑,那么这里也很有帮助。

但实际上,如果您的字典结构确实是自由格式的,那么最好选择ObjectType = Dict[str, object]。毕竟,为了准确识别您正在处理的 EntryType,无论如何您都必须添加一些 isinstance 检查以适当缩小类型。所以,在开始时object代替Union[str, ListType, ObjectType]会有点烦人,根据你在做什么,它可能不会太大。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在多个别名上定义递归 Python 类型? 的相关文章

随机推荐

  • UITableView reloadRowsAtIndexPaths 隐藏行

    我将 UITableView 与静态单元格一起使用 如果我使用reloadData 比一切都好 如果我尝试reloadRowsAtIndexPaths它隐藏行 如果我上下拖动 tableView 更新单元格时 就会出现行 如果您的表格单元格
  • 如何向应用主题添加CardView属性?

    我的问题类似于 如何将 CardView 属性放入样式中 但我需要更深入 我正在使用 AppCompat 主题 我的样式看起来像 style name AppTheme parent Theme AppCompat Light DarkAc
  • 使用C在Linux中获取用户组的正确方法

    我想知道是否有用于 unix 命令组的替代 C 库 groups lists all the group id s of the user 有一个名为 getgroups 的方法 但它返回此方法的用户组 有没有办法使用 C 获取特定用户的组
  • Typescript:在编译时在其自己的属性中获取类名

    例如 如果我们有一个这样的类 class MyClass className string 是否可以在编译时将 MyClass 分配给 className 属性 编辑 已经尝试过 this constructor name 然而 后者对缩小
  • Android:TimePicker setIs24HourView 不起作用

    我正在尝试以 24 小时格式使用 TimePicker 并且我正在使用 setIs24HourView true 但我仍然没有在 TimePicker 上获得 24 小时格式 这是我在 Activity 的 onCreate 中的代码 ti
  • Python While 循环突破问题

    我的问题是关于 while 循环的标志 这有效 但不像我想象的那样 我认为我不明白某些事情 所以如果有人能够解释 那就太好了 根据我的理解 一旦满足我的条件之一 这应该会打破循环 因此 如果我输入 q 它应该会中断并停止循环 但发生的情况是
  • Keycloak:缺少领域公钥

    当我访问 keycloak 管理控制台 远程 并创建客户端时 keycloak OIDC JSON 没有公钥 我希望 JSON 中有类似的内容 realm public key MIIBIjANBg 最新的 keycloak 中的 keyc
  • 如何为私有子网中部署的服务配置api网关?

    我在私有子网中部署了一个 Web 服务 而在公共子网中没有 ELB 现在我想把它曝光给公众 我可以使用API 网关作为http代理吗 公开 有人知道该怎么做吗 该服务必须是公开的 API Gateway 才能连接到它 您可以使用 SSL 客
  • 将单词拆分为所有可能的“子词” - 所有可能的组合

    我正在尝试将一个单词拆分为子单词 所有可能的排列 Input Bang Output B ang Ba ng Ban g B a ng B an g Ba n g B a n g 我希望我涵盖了所有可能的安排 Bang 的方法 我想了很久却
  • 使用 sed,在模式上方或下方插入一行? [复制]

    这个问题在这里已经有答案了 我需要通过在唯一模式的正下方或上方插入一行或多行来编辑大量文件 请建议如何使用sed awk perl 或其他任何东西 在外壳中 谢谢 例子 some text lorem ipsum dolor sit ame
  • 连接python套接字和java套接字

    我一直在尝试在 Java 客户端套接字和 Python 服务器套接字之间发送一个简单的字符串 这是服务器套接字的代码 HOST PORT 12000 s socket socket socket AF INET socket SOCK ST
  • 如何使用 Cmake 和 NASM 构建二进制文件

    我正在学习 x64 并且我讨厌 make 所以我试图让 cmake 使用 NASM 构建二进制文件 cmake 大致支持这一点 但文档很糟糕 这就是我现在所做的工作 将堆栈溢出中的内容拼凑在一起 然后删除所有不会破坏构建的内容 cmake
  • 绑定到当前项目 (WPF)

    我正在尝试绑定一个ListView控制到一个DataTable 但 WPF 绑定系统似乎抱怨我指定的绑定路径 举个例子 一个GridViewColumn定义如下
  • CMake 对 C 文件禁用 -std=c++11 标志

    我正在尝试建立bkchaind 一种构建选项是使用 cmake 因此我使用 Homebrew OSX 10 9 1 安装它 当我做cmake不过 我得到 2 Building C object json rpc cpp src jsonrp
  • 在 Java 中 fork 一个进程

    是否可以将正在执行的 程序 从单个执行序列创建为两个子程序的完整分支 生成的子程序完全相同 它们具有相同的执行顺序和值 但现在它们是两个不同的程序 这就像创建一个对象的克隆 从而为我们提供了两个相同类型的不同对象来处理 但这里我们想要创建一
  • range over 存储切片的接口{}

    假设您有一个接受的函数t interface 如果确定t是一个切片 我该怎么做range在那片上 func main data string one two three test data moredata int 1 2 3 test d
  • List[Int] 和 List[Integer] 类型擦除的差异

    为什么List scala Int 键入擦除List Object whilst Integer in List java lang Integer 似乎 被保存 例如 javap for object Foo def fooInt Lis
  • IE (HTTPS):从 php 文件生成 pdf 不起作用

    这是我的问题 我正在尝试调用页面 foo php docID bar 并将 PDF 返回到屏幕 该 PDF 作为 BLOB 存储在数据库中 这是我的代码中实际返回 PDF 的部分 docID isset REQUEST docID REQU
  • 来自 Android Studio 的详细构建日志

    使用 Android Studio 构建时如何获取详细日志 包括编译器和链接器的命令行参数 我刚刚从 Ant Android mk 构建过渡到 Android Studio 构建 在旧系统中 我能够通过执行以下操作来了解编译器是如何被调用的
  • 如何在多个别名上定义递归 Python 类型?

    我想要这个逻辑类型结构 from typing import List Dict Union ObjectType Dict str EntryType ListType List EntryType EntryType Union str