Скопировать подпись типа из другой функции - PullRequest
1 голос
/ 13 января 2020

Представьте, что у меня есть набор функций, как показано ниже. foo имеет много аргументов различных типов, а bar передает все свои аргументы этой другой функции. Есть ли способ заставить mypy понять, что bar имеет тот же тип, что и foo, без явного копирования всего списка аргументов?

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

1 Ответ

0 голосов
/ 13 января 2020

Было много дискуссий о добавлении этой функции здесь . Для простого случая передачи всех аргументов вы можете использовать рецепт из этого комментария :

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'
...