"invalid type" 自引用 mypy 类型错误
"invalid type" error in self-referential mypy types
我定义了以下类型:
KRPCTypes = typing.Union[int, bytes, list, "KRPCDict"]
KRPCDict = typing.Dict[bytes, KRPCTypes]
当我 运行 mypy
时,出现以下错误:
error: Invalid type "test.KRPCDict"
这是重现错误的完整最小代码:
import typing
KRPCTypes = typing.Union[int, bytes, list, "KRPCDict"]
KRPCDict = typing.Dict[bytes, KRPCTypes]
谢谢!
不幸的是,mypy 和 Python 打字生态系统目前不支持递归类型。
您可以在这里找到它的问题:https://github.com/python/mypy/issues/731(尽管您应该忽略中间的一些帖子,因为它们是由最终遇到无关问题的人发布的)。
线程中的主要阻塞者(例如 "we should implement structural subtyping first")是 under active development,希望在接下来的几个月中至少成为 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
的文档(开发者希望在公开它之前先解决所有主要错误),但是如果你想尝试修补它,我写了一个你会如何做的例子在 .
使用它
我定义了以下类型:
KRPCTypes = typing.Union[int, bytes, list, "KRPCDict"]
KRPCDict = typing.Dict[bytes, KRPCTypes]
当我 运行 mypy
时,出现以下错误:
error: Invalid type "test.KRPCDict"
这是重现错误的完整最小代码:
import typing
KRPCTypes = typing.Union[int, bytes, list, "KRPCDict"]
KRPCDict = typing.Dict[bytes, KRPCTypes]
谢谢!
不幸的是,mypy 和 Python 打字生态系统目前不支持递归类型。
您可以在这里找到它的问题:https://github.com/python/mypy/issues/731(尽管您应该忽略中间的一些帖子,因为它们是由最终遇到无关问题的人发布的)。
线程中的主要阻塞者(例如 "we should implement structural subtyping first")是 under active development,希望在接下来的几个月中至少成为 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
的文档(开发者希望在公开它之前先解决所有主要错误),但是如果你想尝试修补它,我写了一个你会如何做的例子在