我尝试转发和/或存储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
不能通过typing
或typing_extensions
导入,而只能通过mypy_extensions
导入,将其作为依赖项感觉很奇怪。但即使我接受它,它也会给我一个类,而不是一些Generic
。
我怎样才能在不丢失命名参数的类型提示的情况下解决这个问题?
顺便说一句,在一个实际的项目中,我转发了kw-args,所以允许上面代码片段中的列表只接受一个带有一个(通用)参数名的kw-args,比如MutableSequence[Callable[[NamedArg(int, 'val')], None]]
。
1条答案
按热度按时间rekjcdws1#
如果
Callable[...]
语法不足以定义您的签名,您需要的是回调协议。应用到您的示例中,它看起来像这样:
字符串