缩小通用可调用定义

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

我想定义一个自定义类型,使用

ParamSpec
TypeVar
然后可以根据使用的地方根据需要缩小。

我已经定义了一个自定义泛型类型,它代表一个函数或协程函数,它接受一些参数并返回一个值。

_P = ParamSpec("_P")
_R = TypeVar("_R")
FunctionOrCoroutine = Union[Callable[_P, _R], Callable[_P, Awaitable[_R]]]

然后我希望能够在更具体的地方使用时缩小它的范围,例如我需要一个不带参数并返回字符串的函数/协程函数

def foo(callback_fn: FunctionOrCoroutine[[], str]):
    pass

以上在 Python 3.10 中有效,但是当我在 3.9 上尝试这个时(使用

typing-extensions
backport 来访问
ParamSpec
),我得到以下错误:

TypeError:泛型的参数必须是类型。得到 [].

我在这里做错了什么?我不明白为什么这会在 3.10 上运行,但在 3.9 上不起作用,即使

ParamSpec
向后移植。有什么解决方法吗?我只是误解了一些基本的东西吗?

python mypy python-typing
© www.soinside.com 2019 - 2024. All rights reserved.