Выбор ответа 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 проверяется анализатором.

Варианты ответа

  1. Callable[..., Any] -> Callable[..., Any] для любых функций
  2. ParamSpec и переменная типа: Callable[P, R] -> Callable[P, R]правильный ответ
  3. Аннотировать обёртку как *args: Any, **kwargs: Any
  4. Это невозможно в 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 ошибок.