Выбор ответа Senior Типизация обновлено
Типизация декоратора с сохранением сигнатуры
Вопрос
Как типизировать декоратор так, чтобы декорированная функция сохранила для анализатора свои параметры и тип результата?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: ParamSpec и переменная типа: Callable[P, R] - Callable[P, R]. ParamSpec (3.10+, в синтаксисе 3.12 def decoP, R - Callable[P, R]) захватывает весь список параметров функции, и обёртка def wrapper(args: P.args, kwargs: P.kwargs) - R проверяется анализатором.
Варианты ответа
Callable[..., Any] -> Callable[..., Any]для любых функцийParamSpecи переменная типа:Callable[P, R] -> Callable[P, R]правильный ответ- Аннотировать обёртку как
*args: Any, **kwargs: Any - Это невозможно в Python, только через stub-файлы
Разбор
ParamSpec (3.10+, в синтаксисе 3.12 def deco[**P, R](fn: Callable[P, R]) -> Callable[P, R]) захватывает весь список параметров функции, и обёртка def wrapper(*args: P.args, **kwargs: P.kwargs) -> R проверяется анализатором. Callable[..., Any] и Any теряют сигнатуру: вызов с неверными аргументами пройдёт проверку.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.