Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
decorated(*x)
...
fn(*x)
Писатьdecorated(*x, **y)
...
fn(*x, **y)
Иначе функции после декорирования могут «вести себя неоднозначно».functools.wraps. Это хорошая практика, и стоит к ней приучать.from module import func
func = decorator(func)
non_atomic_requests на иллюстрации).Это опять же следует из определения. Раз декоратор является частью объявления функции, вы его не можете отменить. Точно так же как вы не можете например сделать так, чтобы одна функция возвращала разные значения. Но вы опять же можете обернут любым количеством разных функция.Не совсем. Я здесь где‐то видел пример вытягивания оригинальной функции из пачки вложенных декораторов с помощью какого‐то хака. И хак, насколько я помню, предполагал, что все декораторы реализованы на замыканиях. А ведь есть ещё встроенные функции (написанные на C) и классы в качестве декораторов. Так что так лучше не делать.
functools.wraps, который применяет сам functools.wraps, после чего сохраняет оригинальную функцию как значение атрибута powerline_origin и своё расширение для Sphinx, которое умеет с этим делом работать. Впрочем, ни первое, ни последнее практически не представляет проблемы: вместо велосипедостроения в последнем случае я просто использую своего наследника одного из классов autodoc и вызываю его же функцию setup. Желания найти статью и взять оттуда хак у меня не возникло.---->, показываемая если вы включили автовызов функций и набрали в строке, к примеру str: без скобок) с помощью своего класса со своими методами __str__ и __add__.
Python: декорируем декораторы. Снова