TLDR;
У меня есть декоратор, который:- меняет сигнатуру функции
- обернутая функция использует некоторые аргументы общего типа
- Кроме подписи я хотел бы использовать funtools.wraps, чтобы сохранить остальную информацию.обернутая функция использует некоторые аргументы общего типа.
Кроме подписи я хотел бы использовать funtools.wraps, чтобы сохранить остальную информацию. li>
Дополнительный контекст
Минимальный рабочий пример будет выглядеть так:
Код: Выделить всё
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
Код: Выделить всё
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]"
Вопрос
Я что-то упустил? Это какая-то ошибка или ограничение, о которых уже сообщалось в mypy (ничего не удалось найти)? Следует ли об этом сообщать?
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/788 ... c-function