我有一个函数,其参数之一预计是类型提示:类似
typing.List
、或 typing.List[int]
,甚至只是 int
。任何您合理期望看到的普通字段的类型注释。
这个参数的正确类型提示是什么?
(这里的上下文是我正在编写一个实用程序,该实用程序适用于使用类型注释定义字段的类,有点像数据类装饰器。)
几乎完整但可读性较差的答案:
type | types.GenericAlias | types.UnionType | typing._BaseGenericAlias | typing._SpecialForm
以下是我能想到的所有类型注释的可能性(在 Python 3.10 中):
int
、list
等。对应type
。list[int]
。对应types.GenericAlias
。int | float
(但typing.Union[int, float]
不是,它对应于下一项)。对应types.UnionType
。typing
中的通用具体集合,例如
typing.List
、typing.List[int]
等。这里我选择最先出现在其继承链中的公共基类typing._BaseGenericAlias
。 (其实不仅是这些,typing
中几乎所有可下标的注解类都继承自该类,包括typing.Literal[True]
、typing.Union[int, float]
等)typing.Any
、typing.NoReturn
等。对应于typing._SpecialForm
。需要注意的是,最后两种类型以下划线开头,表明它们是内部类型,不应该从
typing
导入和使用。然而,如果你坚持完全覆盖所有类型注释,它们应该是不可或缺的。
继续@Mechanic Pig的回答(谢谢!),我创建了这个令人厌恶的东西,PyCharm和mypy(好吧,我用python 3.11 + mypy 1.4.1进行了测试)批准了:
from types import GenericAlias, UnionType
from typing import Any, Literal, TypeAlias
BaseGenericAlias: TypeAlias = type(Literal[0]).__base__.__base__ # type: ignore[name-defined]
SpecialForm: TypeAlias = type(Any) # type: ignore[valid-type]
TypeHint: TypeAlias = (
type # type: ignore[valid-type]
| GenericAlias
| UnionType
| BaseGenericAlias
| SpecialForm
| type(None)
)
# `type: ignore`s can be removed if mypy is not used
type(Literal[0]).__base__.__base__
决心typing._BaseGenericAlias
type(Any)
决心typing._SpecialForm
我还添加了
type(None)
,因为否则下面的代码片段将不起作用(真实的示例是函数的类型提示,不会返回任何内容):
assert isinstance(None, TypeHint)
整个事情都经过测试像这样,再次,python 3.11
将此留给任何未来“输入类型提示”的企业家,祝你好运