如何为具有特定关键字参数的函数添加类型提示?

Cha*_*e A 6 python typing type-hinting mypy

我想向其输入(也是函数)具有特定关键字参数的高阶函数添加类型提示。

我的代码看起来与此类似:

def foo(a: int, b: int) -> int:
    ...


def bar(c: Callable[[int, int], int]) -> int:
    return c(a=1, b=2)  # getting a mypy error: Unexpected keyword argument "a"
Run Code Online (Sandbox Code Playgroud)

在示例中,我希望能够c从 的函数作用域进行调用bar,并且我希望能够假设它具有关键字参数ab

我可以理解为什么 mypy 会在这里抱怨,因为具有不同签名的其他函数可以作为参数传入b,然后c(a=1, b=2)将不再起作用。但似乎应该有一种方法可以在类型提示中添加关键字参数名称,以明确保证函数接受带有名称和 的c参数。ab

ale*_*ame 5

mypy 扩展用于扩展Callable

from typing import Callable
from mypy_extensions import (Arg, DefaultArg, NamedArg,
                             DefaultNamedArg, VarArg, KwArg)
                             
def foo(a: int, b: int) -> int:
    ...


def bar(c: Callable[[Arg(int, 'a'), Arg(int , 'b')], int]) -> int:
    return c(b=1, a=2)  # no issues
Run Code Online (Sandbox Code Playgroud)