Mypy 1.10 сообщает об ошибке, когда functools.wraps() используется для общей функцииPython

Программы на Python
Anonymous
Mypy 1.10 сообщает об ошибке, когда functools.wraps() используется для общей функции

Сообщение Anonymous »

TLDR;

У меня есть декоратор, который:
  • меняет сигнатуру функции
  • обернутая функция использует некоторые аргументы общего типа
  • Кроме подписи я хотел бы использовать funtools.wraps, чтобы сохранить остальную информацию.обернутая функция использует некоторые аргументы общего типа.
    Кроме подписи я хотел бы использовать funtools.wraps, чтобы сохранить остальную информацию. li>
Есть ли способ добиться этого без жалоб mypy?

Дополнительный контекст
Минимальный рабочий пример будет выглядеть так:

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

from functools import wraps
from typing import Callable, TypeVar

B = TypeVar('B', bound=str)

def str_as_int_wrapper(func: Callable[[int], int]) -> Callable[[B], B]:
WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__qualname__', '__doc__',)
WRAPPER_UPDATES = ('__dict__', '__annotations__')

@wraps(func, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)
def _wrapped_func(val: B) -> B:
num = int(val)
result = func(num)
return val.__class__(result)

return _wrapped_func

@str_as_int_wrapper
def add_one(val: int) -> int:
return val + 1
Кажется, это работает нормально, но mypy (версия 1.10.0) это не нравится. Вместо этого он жалуется

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

test.py:17: error: Incompatible return value type (got "_Wrapped[[int], int, [Never], Never]", expected "Callable[[B], B]")  [return-value]
test.py:17: note: "_Wrapped[[int], int, [Never], Never].__call__" has type "Callable[[Arg(Never, 'val')], Never]"
Если я удалю декоратор @wraps или заменю аннотации типа B на str, ошибка исчезнет.
Вопрос
Я что-то упустил? Это какая-то ошибка или ограничение, о которых уже сообщалось в mypy (ничего не удалось найти)? Следует ли об этом сообщать?
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/788 ... c-function

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