我正在尝试输入提示函数
bar
,但在运行 mypy 时出现 Too few arguments
错误。
from typing import Callable, Optional
def foo(arg: int = 123) -> float:
return arg+0.1
def bar(foo: Callable[[int], float], arg: Optional[int] = None) -> float:
if arg:
return foo(arg)
return foo()
print(bar(foo))
print(bar(foo, 90))
我也尝试过:
Callable[[], float]
(出现Too many arguments
错误)Callable[[Optional[int]], float]
(又出现错误)那么,我应该如何进行
bar
函数的类型提示呢?
定义这个:
class Foo(Protocol):
def __call__(self, x: int = ..., /) -> float:
...
然后输入提示
foo
作为 Foo
而不是 Callable[[int], float]
。 回调协议允许您:
定义灵活的回调类型,这些类型很难(甚至不可能)使用
语法来表达Callable[...]
和可选参数是用普通
Callable
不可能表达的事情之一。 /
签名末尾的__call__
使x
成为仅位置参数,它允许任何传递给bar
的函数具有不是x
的参数名称(您的具体示例foo
称之为 arg
)。如果您删除了 /
,那么不仅类型必须按预期排列,而且名称也必须排列,因为您将暗示可以使用关键字参数调用 Foo
。因为 bar
不会使用关键字参数调用 foo
,所以通过省略 /
选择该行为会给 bar
的用户带来不灵活性(并且会使您当前的示例仍然失败,因为 "arg" != "x"
)。