Развёрнутое пояснение:
1. retry(2) вызывается и возвращает функцию decorator.
2. Синтаксис @retry(2) применяет decorator к функции fetch.
3. decorator создаёт функцию wrapper и возвращает её.
4. Итоговое имя fetch теперь ссылается на объект wrapper.
5. Внутренняя функция wrapper не обёрнута в functools.wraps(f), поэтому её атрибут __name__ остаётся 'wrapper'.
6. print(fetch.__name__) печатает wrapper.
Почему это важно: в production-коде декораторы с аргументами часто забывают обернуть внутреннюю функцию в functools.wraps. Это ломает логирование, метрики и отладку, потому что все обёрнутые функции начинают называться wrapper, а их __doc__ становится None. Правильный шаблон — добавить @wraps(f) над wrapper.
Post #4817
289
Python: задачки и вопросы
- ✍ 1