行为类似于基本类型的泛型类型

问题描述 投票:0回答:1

我想创建一个泛型类型

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

有办法做到这一点吗?

python mypy python-typing
1个回答
0
投票

一种方法是使用返回其唯一类型参数的泛型类型别名:

(游乐场链接:MypyPyright

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[]
:

(游乐场链接:MypyPyright

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'>

后者是首选,特别是如果您想将元数据附加到相关类型。

© www.soinside.com 2019 - 2024. All rights reserved.