Pull to refresh

Comments 11

100500 статья про декораторы на хабре

При этом я уже читал такую же статью на Хабре

При этом статья очень слабая и даже местами вредная.

Декоратор – не что иное, как функция 

это неверное утверждение

т.е. декоратор будет вызван только тогда, когда вы «вызовете» класс. 

и это тоже не правда

Декорирование класса в Python работает как изменение класса извне (т.е. из декоратора).

что прямо противоположно утверждению "декоратор будет вызван только тогда, когда вы «вызовете» класс. Вызов класса означает создание его экземпляра" и является в общем-то чушью

только его конструктор (метод init)

инит это не конструктор

ну и так далее. Зачем это было написано? Это даже не плохо процитированный учебник, это записки студента на полях. При желании можно было бы написать полезную статью про декораторы. Как сделать универсальный декоратор для которого не обязательны скобки при отсутствии параметров, как сделать декоратор с состоянием, как совместно использовать мощь декораторов и дескрипторов, например.

> Декоратор – не что иное, как функция

это неверное утверждение

Почему? В словаре питона написано буквально "A function returning another function, usually applied as a function transformation using the @wrapper syntax".

Декоратором может быть не только функция, но и любой вызываемый объект. На эту тему есть множество зарубежных и русскоязычных статей, если интересно.

Согласен. Но всё таки это вполне себе функция. Или нечто под неё мимикрирующее. Я привел цитату из официальной документации Python. Использование классов менее распространено, согласно той же документации.

Мой поинт в том, что ваше высказывание слишком категорично, в то время согласно официальной документации оно вполне покрывает большую часть случаев.

"Все данные в Python представлены объектами".

Если пользователю важен практический опыт применения декораторов, то приведенного вами определения может оказаться вполне достаточно. На практике они часто используются именно как функции, которые принимают и возвращают функции.

Однако, если разбираться в деле максимально подробно, было бы неплохо узнать обо всех нюансах, связанных с декораторами, включая определение и примеры использования.

С этим полностью согласен.

Во-первых, это 571654-ая статья на хабре про декораторы, а во-вторых, статья... как бы это помягче сказать-то... Начинается умными словами, но содержит массу ошибок и неточностей. 2/10.

Начать стоит с того, что декоратор - это НЕ функция. Ну и дальше в общем можно не читать.

(Немного могу подушить, но статья и правда похожа на "разбор" декораторов, ка будто _без глубокого изучения материала_)

(Писал с телефона, за форматмрование извините)

(Мне не нравится эта статья. Это же перевод? Что ж, переводчик тоже должен быть способен отбирать информацию, а не переводить всё подряд)

Список фейлов в "статье":

"С учетом нашего изначального определения декоратора..."

Приведено не определение, а пример использования, на крайний случай это объяснение способа работы (что делает), а не определение (чем является) декоратора.

"В итоге мы обрабатываем три функции..."

Где обрабатываете? В приведённом фрагменте кода присутствуют имена (retry, _wrapper, might_fail), они максимум используются

"Декоратор – не что иное, как функция (которая принимает другую функцию в качестве аргумента)"

Смешно, но больше, пожалуйста, так не шутите в статьях на подобную тему.

(придирка):

"Чтобы использовать декоратор, нужно поместить его перед определением функции без ее вызова"

Больше на заметку похоже, слишком поверхностно ("оно подходит под то, что мы придумали, значит это оно и есть").

(придирка):

Не используйте "except:" (bare except) — это опасно, так как в этом случае ловятся _больше, чем все_ ошибки и в приведённом примере можно было указать, какие ошибки перехватывать и подавлять.

"В частности, он меняет некоторые атрибуты специальных методов...",

"При использовании @functools.wraps все эти атрибуты возвращаются к значениям по умолчанию."

Опять же: не шутите так больше, если не знаете, о чём пишете: functools.wraps ничего не "возвращает к значениям по умолчанию", а копирует метаданные переданного (объекта?) (у вас это функция func) на оборачиваемый (объект? функцию? пусть будет так)

" Этот факт никак не меняет логику или функциональность нашего декоратора-таймера. С таким же успехом вы могли бы вообще не использовать @functools.wraps."

Ну так и не используйте — абзац не несёт полезной нагрузки: сказали "мы используем это, а что это такое — не важно, можете не использовать", тема не раскрыта.

"Помните, что @нотация - это просто эквивалент записи MyClass = timer(MyClass), т.е. декоратор будет вызван только тогда, когда вы «вызовете» класс"

Так разве это не означает, что декоратор будет вызван тогда, когда будет созаваться сам класс, а не объект этого класса? Здесь, насколько мне стало понятно из pep 3129, декоратором является это:

"@timer

class MyClass: ..."

"Методы класса не декорируются автоматически при декорации класса. Проще говоря, при использовании декоратора для обычного класса декорируется только его конструктор (метод __init__)."

Хотел опять пошутить "не шутите так больше", но кстал от полного непонимания темы в статье. КАК МОЖНО В ДВУХ СОСЕДНИХ ПРЕДЛОЖЕНИЯХ СКАЗАТЬ СОВЕРШЕННО РАЗНЫЕ И НЕ СЛЕДУЮЩИЕ ДРУГ ИЗ ДРУГА ВЕЩИ? Только что же вроде правильно написали, что декорируется **класс**. Так почему в следующем какой-то абсурдный вывод? (Хабровчане, научите зарабатывать социальный рейтинг на миска риса чтобы ставить отметка на плохой статья).

"Декорирование класса в Python работает как изменение класса извне (т.е. из декоратора)."

Опять же, несколькими предложениями назад было чётко написано, что декорирование = вызов декоратора на декорируемом объекте, так почему тут вывод, (не совсем совершенно, но в целом) не следующий из выше написанного? Если декорирование это вызов декоратора на декорируемом объекте (функция/класс), то это означает, что внутри с переданным можно делать то же, что и без декоратора - что-то, что и так разрешено делать с функциями или классами извне (в случае наслоения декораторов - **на результате вызова предыдущего декоратора**).

"Вы можете использовать декораторы для изменения классов подобно наследованию."

Выше уже писал в общем виде, здесь конкретизирую: наследование и декорирование - разные вещи. Они **НЕ** подобны.

(придирка):

"Декоратор dataclass из стандартной библиотеки - отличный пример разумного использования, при котором декораторы предпочтительнее наследования"

Обычно декоратор dataclass используется для dto'шек (классы данных) + какой-то дополнительной логики. В основном он используется (как сам встречал) для уменьшения однотипного _boilerplate_ кода.

"Отсюда можно сделать два вывода:

Декораторы могут быть вложенными. Важен порядок их написания.

Декоратор @dataclass_json добавил в наш класс метод to_dict"

На второе утверждение мне в целом всё равно, интересует только первое: Этот абзаз (или эти абзацы), насколько понятно из них самих, показывают примеры использования некоторых готовых декораторов. Эти предложения, в свою очередь, имеют отношение к разбору использования декораторов в целом. Считаю, что статья не структурирована (к примеру, мне не интересно читать про готовые декораторы и я хочу пропусить часть статьи, где приводятся примеры, но непосредственно в этой части нагло спрятана основная часть стати, которая мне могла бы быть потенциально интересна и может даже полезна)

"Завтра в **** состоится открытое занятие «Docker ..."

И вся эта "с т а т ь я" была лишь для рекламы курсов. По качеству этой статьи даже посещать всякие "занятия" не привлекает вообще. Реклама так себе.

P. S. я найти способ понять социальный рейтинг — надо написать хороший статья про декораторы.

Sign up to leave a comment.