如何输入提示具有默认参数的函数的 Callable?

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

我正在尝试输入提示函数

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
函数的类型提示呢?

python python-typing mypy
1个回答
51
投票

定义这个:

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"
)。

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