python-3.x 如何删除“不兼容类型“Callable[[NamedArg(int,'val')],..”?

muk1a3rh  于 2023-11-20  发布在  Python
关注(0)|答案(1)|浏览(92)

我尝试转发和/或存储Callable s,同时提供尽可能多的类型提示。目前我正在与一个看似简单的mypy错误作斗争,但不知何故我无法解决它。想象一下这个包含Callable s集合的小片段:

from collections.abc import Callable, MutableSequence

functions: MutableSequence[Callable[[int], None]] = []

def foo(val: int) -> None:
    print(val)

functions.append(foo)

字符串
虽然有点无意义,它的工作和mypy --strict给我零问题。
现在我想让foo只接受命名参数:

def foo(*, val: int) -> None:


mypy给了我

./foo.py:11: error: Argument 1 to "append" of "MutableSequence" has incompatible type "Callable[[NamedArg(int, 'val')], None]"; expected "Callable[[int], None]"  [arg-type]


..这听起来似乎很合理,但有没有办法解决这个问题?NamedArg不能通过typingtyping_extensions导入,而只能通过mypy_extensions导入,将其作为依赖项感觉很奇怪。但即使我接受它,它也会给我一个类,而不是一些Generic
我怎样才能在不丢失命名参数的类型提示的情况下解决这个问题?
顺便说一句,在一个实际的项目中,我转发了kw-args,所以允许上面代码片段中的列表只接受一个带有一个(通用)参数名的kw-args,比如MutableSequence[Callable[[NamedArg(int, 'val')], None]]

rekjcdws

rekjcdws1#

如果Callable[...]语法不足以定义您的签名,您需要的是回调协议。
应用到您的示例中,它看起来像这样:

from collections.abc import MutableSequence
from typing import Protocol

class FooCallable(Protocol):

    def __call__(self, *, val: int) -> None:
        ...

functions: MutableSequence[FooCallable] = []

def foo(*, val: int) -> None:
    print(val)

functions.append(foo)

字符串

相关问题