Почему не я люблю декораторы и метаклассы

Я не люблю декораторы и метаклассы. Почти любое использование декоратора и любое использование метакласса ухудшает читаемость кода. Их трудно использовать без усложнения кода. Они приводят к трудновыявляемым багам. Так что их использование должно быть обосновано. И их не нужно использовать там, где можно легко и безболезненно обойтись без них. Если сравнить использование остальных конструкций языка с использованием рогатки, то использование декоратора — это стрельба из пушки, а метаклассы — из системы залпового огня «Град». Последствия их неправильного использования влияют на кодовую базу примерно так же. Декоратор «разламывает» несколько функций и методов, метакласс «разрывает в клочья» несколько классов. ...

14 сентября 2015 г.

Type Hinting в Python 3.5

«Утиная» типизация, конечно, ускоряет написание программ, но только до определённых пределов. В больших проектах, когда количество кода достаточно велико, такая гибкость начинает давать сбои. С Python 3.0 можно делать типизацию для функций. Но только с 3.5 появится действительно мощный инструмент, встроенный в язык. Конечно, можно делать описание параметров и возвращаемых значений в докстрингах. Вот только кто их пишет? А если пишет, то кто следит за их актуальностью? Программисты ленивы: если можно что‑то не делать, они не будут этого делать. ...

31 августа 2015 г.

Кастомные коллекции

Хорошо написанный код на Python должен работать с последовательностями однообразно. При этом неважно, встроенные это последовательности или нет. Тем более что свою последовательность написать в Python очень просто. Нужно всего лишь переопределить __len__ и __getitem__, чтобы работа с вашей последовательностью в большинстве случаев не отличалась от работы со встроенными последовательностями. В качестве иллюстрации возьмём такой пример. У нас есть класс ShoppingBasket. В нём лежат какие‑то товары. Пусть нам нужно пройтись по всем товарам, научиться получать товары по ключу и добавлять товары. ...

24 августа 2015 г.

Celery: Pickle от которого невозможно отказаться

Если вы решили поменять сериализатор задач для Celery с Pickle на какой‑нибудь другой, ничего не выйдет. Вернее, задачи действительно будут сериализоваться и десериализоваться с помощью указанного сериализатора. Но внутри Celery всё равно используется Pickle, и это никак не изменить. Вернее, не в Celery, а в библиотеке billiard, которая используется мастер‑процессом воркера для раздачи задач из очереди подпроцессам. В нашем проекте мы столкнулись с тем, что иногда передаём в качестве параметра задач Celery NoneType. Причём не значение None, а именно NoneType. ...

10 августа 2015 г.

Декораторы с параметрами по умолчанию

Декораторы в Python — удобный инструмент. Если ими пользоваться с умом, они значительно повышают читаемость кода и его повторное использование. Но есть один момент, который меня немного напрягает: для декоратора с параметрами по умолчанию нужно ставить пустые круглые скобки после его вызова. Время от времени это приводит к ошибкам. Особенно это актуально, если декоратор является частью публичного API. @decorator_wo_params def f1(): pass @decorator_w_defaults_params() # Ну зачем здесь пустые скобки? def f2(): pass С этим можно смириться. В режиме жёстких сроков и большого потока задач времени на поиск решения, написание и тестирование дополнительного кода может просто не быть. Нормальное тестирование выявит проблему моментально. Но иногда невозможно удержаться и не сделать свой код немного красивее. ...

3 августа 2015 г.