我想创建一个泛型类型
A[T]
,其行为与 T
完全相同,只不过我可以在运行时告诉我该类型实际上是 A[T]
而不是 T
。
我试过了
class A(Generic[T], T):
pass
但这似乎不起作用,例如 mypy 抱怨,
A[str]
是 object
类型。
举个例子,我想要这样的东西通过类型检查:
def f(s: A[str]):
return re.findall('foo|bar', s)
但当我获取该类型的变量或检查函数签名时,仍然能够在运行时区分
A[str]
和 str
。
有办法做到这一点吗?
一种方法是使用返回其唯一类型参数的泛型类型别名:
type A[T] = T
def f(s: A[str]) -> None:
reveal_type(s) # str
re.findall('foo|bar', s) # fine
f('') # fine
>>> type(inspect.get_annotations(f)['s'])
<class 'types.GenericAlias'>
Annotated[]
:
from typing import Annotated
# There must be at least two arguments
def f(s: Annotated[str, 'Whatever']) -> None:
reveal_type(s) # str
re.findall('foo|bar', s) # fine
f('') # fine
>>> type(inspect.get_annotations(f)['s'])
<class 'typing._AnnotatedAlias'>
后者是首选,特别是如果您想将元数据附加到相关类型。