当链接用 ParamSpec 注释的函数时,mypy 检查失败

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

如果我定义两个函数,它们将另一个函数及其参数作为参数,以及一个简单函数,如下所示

from typing import Callable, TypeVar, ParamSpec

T1 = TypeVar('T1')
P1 = ParamSpec('P1')
T2 = TypeVar('T2')
P2 = ParamSpec('P2')


def wrapper1(
        func: Callable[P1, T1],
        *args: P1.args,
        **kwargs: P1.kwargs
) -> T1:
    return func(*args, **kwargs)


def wrapper2(
        func: Callable[P2, T2],
        *args: P2.args,
        **kwargs: P2.kwargs
) -> T2:
    return func(*args, **kwargs)

def func() -> int:
    return 1

我尝试像这样链接这三个函数

wrapper1(wrapper2, func)

然后 mypy 在此调用链上报告以下错误:

src/test.py:29: error: Argument 1 to "wrapper1" has incompatible type "Callable[[Arg(Callable[P2, T2], 'func'), **P2], T2]"; expected "Callable[[Arg(Callable[P2, T2], 'func'), **P2], T2]"  [arg-type]
src/test.py:29: error: Argument 2 to "wrapper1" has incompatible type "Callable[[], int]"; expected "[Callable[P2, T2], **P2.args]"  [arg-type]

如果我避免像这样链接函数,那么 mypy 就不会报告错误:

def w2() -> int:
    return wrapper2(func)
wrapper1(w2)

有没有办法注释这些函数,以便接受简单的链接,而不必为第二次调用定义函数?

我正在使用 mypy 1.0.1 和 python 3.11.2。

这似乎是一个已知问题

我现在正在关注这些问题。当这些 mypy 问题以某种方式解决后,我会更新这个问题。

python mypy typing
1个回答
0
投票

如果 mypy 使用

--new-type-inference
运行,此问题已在版本 1.6.0 中得到解决(请参阅发行说明中的问题 https://github.com/python/mypy/pull/15896 https://mypy -lang.blogspot.com/2023/10/mypy-16-released.html)。在版本 1.7.0 中,不再需要
--new-type-inference
才能使检查成功,因为新的类型推断算法现在是默认值。

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