注意:本问题涉及 Python 3.12+
假设我有:
from typing import Any, TypeVar
import numpy as np
T = TypeVar("T")
U = TypeVar("U")
ListLike = T | list[T] | tuple[T, ...] | np.ndarray[Any, U]
ListLikeStr = ListLike[str, np.object_]
# ListLikeStr should be: str | list[str] | tuple[str, ...] | np.ndarray[Any, np.object_]
这有效,但幸运的是。我本可以这样写:ListLike[np.object_, str]
,然后我会得到ListLikeStr
being np.object_ | list[np.object_] | tuple[np.object_, ...] | np.ndarray[Any, str]
,但这不是我想要的。
理想情况下,我可以这样做:ListLike[T=str, U=np.object_]
,但这样做行不通。那么,当我在 中实例化类型变量时,是什么决定了顺序ListLike
?当我写 时,ListLike
“知道”T
与str
和U
相对应?np.object_
ListLike[str, np.object_]
在“传统”类型别名中,先引用的即先执行。
PEP 695
type
声明是为了解决这个问题而创建的:(游乐场链接:Pyright)
Mypy尚未添加对它的支持,但您可以
TypeAliasType
从中导入typing_extensions
以获得相同的结果(所有 Python 版本):(游乐场链接:Mypy、Pyright)