不幸的是,mypy 和 Python 类型生态系统目前不支持递归类型。
你可以在这里找到它的问题:https ://github.com/python/mypy/issues/731 (尽管你应该忽略中间的一些帖子,因为它们是由最终遇到不相关问题的人发布的) .
线程中的主要阻塞器(例如“我们应该首先实现结构子类型化”)正在积极开发中,希望在接下来的几个月内至少应该成为 mypy 的一部分,所以也许值得重新讨论。
许多人倾向于使用的当前解决方法(尤其是在尝试键入 JSON 时,您的类型类似于)是手动将递归类型扩展到所需的级别,并最终使用Any
. 例如:
from typing import Union, Dict, List, Any
KRPCTypes = Union[int, bytes, list, Dict[bytes, Union[int, bytes, list, Any]]]
KRPCDict = Dict[bytes, KRPCTypes]
顺便说一句,您可能想要使用typing.List[T]
并指定列表应该包含的类型——如果您只是这样做list
,它默认为typing.List[Any]
,它可能不太精确。
另一种方法可能是使用实验TypedDict
类型,它允许您定义给定字典的确切类型和结构。这不太有用,因为 TypedDict 不能代表每一种KRPCDict
,但如果您希望只处理有限数量的不同类型,它确实会派上用场KRPCDict
。
目前还没有相关文档(开发人员希望在公开之前先解决所有主要错误),但是如果您想尝试修改它,我在底部TypedDict
写了一个如何使用它的示例(基本上不相关) 回答。