Ввод функции карри в Python - PullRequest
0 голосов
/ 22 января 2020

Есть такая функция для карри. Проблема в том, что я не знаю, как заставить эту функцию возвращать декорированную функцию с правильными типами. Помогите, я нигде не нашел решения.

import functools
import typing as ty
from typing import TypeVar, Callable, Any, Optional

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

def curry(func: F, max_argc: Optional[int] = None):
    if max_argc is None:
        max_argc = func.__code__.co_argcount

    @functools.wraps(func)
    def wrapped(*args): 
        argc = len(args)
        if argc < max_argc:
            return curry(functools.partial(func, *args), max_argc - argc)
        else:
            return func(*args)
    return ty.cast(F, wrapped)

@curry
def foo(x: int, y: int) -> int:
    return x + y

foo("df")(5)  # mypy error: Too few arguments for "foo"
              # mypy error: "int" not callable
              # mypy error: Argument 1 to "foo" has incompatible type "str"; expected "int"  # True

Как исправить 1, 2 ошибки mypy?

1 Ответ

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

Перво-наперво, я бы не стал декоратором, я бы обернул его как curry(foo). Меня смущает взгляд на API, где оформленная сигнатура функции отличается от своего первоначального определения.

Что касается типов, то я был бы очень впечатлен, если общий случай возможен с Python подсказками типов , Я не уверен, как бы я это сделал в Scala. Вы можете выполнить ограниченное количество дел, используя overload для функций двух параметров, например

T1 = TypeVar("T1")
T2 = TypeVar("T2")
U = TypeVar("U")

@overload
def curry(
    func: Callable[[T1, T2], U],
    max_argc: Optional[int]
) -> Callable[[T1], Callable[[T2], U]]:
    ...

, добавляя версии для одного, трех, четырех параметров и т.д. c. Функции с большим количеством параметров в любом случае являются запахами кода, за исключением varargs, которые, я не уверен, имеет ли смысл даже карри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...