Mypy и декораторы второго порядкаPython

Программы на Python
Anonymous
Mypy и декораторы второго порядка

Сообщение Anonymous »

Я пытаюсь реализовать декоратор второго порядка, который вводит динамическую переменную в качестве первого аргумента декорируемой функции.
Вот что у меня есть:

Код: Выделить всё

from typing import Callable, Concatenate, ParamSpec, TypeVar

T = TypeVar('T')
U = TypeVar('U')
P = ParamSpec('P')

def foo(some_arg: U) -> Callable[
[Callable[Concatenate[U, P], T]],
Callable[P, T],
]:
def decorator(fn: Callable[Concatenate[U, P], T]) -> Callable[P, T]:
def wrapper(*args: P.args, **kwargs: P.kwargs) -> T:
return fn(some_arg, *args, **kwargs)

return wrapper

return decorator
При запуске mypy я получил следующую ошибку:

Код: Выделить всё

error: Incompatible return value type (
got "Callable[[Arg(Callable[[U, **P], T], 'fn')], Callable[P, T]]",
expected "Callable[[Callable[[U, **P], T]], Callable[P, T]]")  [return-value]
Я не понимаю, в чем я ошибся.
Мне не удалось найти никакой информации об элементе Arg, которую, по словам Mypy, он получил (не удалось найти typing.Arg в документации mypy).
Как мне объявить возвращаемое значение моей фабрики декораторов?
Как мне интерпретировать этот вывод ошибки из mypy? Какой-нибудь источник из документа, который я мог пропустить?

Подробнее здесь: https://stackoverflow.com/questions/772 ... decorators

Вернуться в «Python»