从另一个函数复制类型签名

Kyu*_*chi 4 python mypy python-typing

想象一下,我有一组如下所示的功能。foo有很多不同类型的参数,bar并将所有参数传递给另一个函数。有什么方法可以让 mypy 理解barfoo不显式复制整个参数列表的类型相同?

def foo(a: int, b: float, c: str, d: bool, *e: str, f: str = "a", g: str = "b") -> str:
    ...

def bar(*args, **kwargs):
    val = foo(*args, **kwargs)
    ...
    return val
Run Code Online (Sandbox Code Playgroud)

Ale*_*all 5

有很多关于在此处添加此功能的讨论。对于传递所有参数的简单情况,您可以使用此评论中的配方:

F = TypeVar('F', bound=Callable[..., Any])

class copy_signature(Generic[F]):
    def __init__(self, target: F) -> None: ...
    def __call__(self, wrapped: Callable[..., Any]) -> F: ...

def f(x: bool, *extra: int) -> str: ...

@copy_signature(f)
def test(*args, **kwargs):
    return f(*args, **kwargs)

reveal_type(test)  # Revealed type is 'def (x: bool, *extra: int) -> str'
Run Code Online (Sandbox Code Playgroud)