Как аннотировать тип `apply` в Python? - PullRequest
0 голосов
/ 11 апреля 2020

Можно ли (точно) аннотировать тип функции apply в Python?

Нетипизированная функция:

def apply(f, args):
    return f(*args)

Я хотел бы написать что-нибудь как

from typing import *

T = TypeVar('T')
S = TypeVar('S')
def apply(f: Callable[T,S], args: Tuple[T]) -> S:
    return f(*args)

, но это не работает. mypy по крайней мере жалуется, что первый аргумент Callable должен быть списком ...

Два примера использования apply могут быть:

def add(x: int, y: int) -> int:
    return x + y

def negate(x: int) -> int:
    return -x

apply(add, (x,y))
apply(negate, (x,))

PS Не так Tuple[T] не совсем имеет смысла, даже если T каким-то образом представляет список типов.

1 Ответ

0 голосов
/ 15 апреля 2020

Если вы посмотрите на do c, вы увидите, что список, указанный в подписи Callable[[Arg1Type, Arg2Type], ReturnType], представляет собой список типов переменных

from typing import *

T = TypeVar('T')
S = TypeVar('S')
def apply(f: [[T],S], args: Tuple[T]) -> S:
    return f(*args)
...