Привычки для Python Developer-ов часть 2
Python и 1000 программ
В прошлой части мы усвоили все о генераторах, поняли почему правила важны, научились увеличивать прозводительность правильно, вникли в суть тестов, а также осознали важность срезов. В этом уроке мы вникнимся в дескрипторы, дата-классы, константы и т.д
Храните данные правильно
Есть несколько разных способов хранить данные:
Просто передавать данные напрямую:

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

Такой способ хранения данных гораздо лучше. Если поменяется адрес файла, мы просто изменим одну константу и весь остальной код получит уже новую ссылку.
Использовать Дата-Классы:

Лучший способ хранения данных. Почему? Например:
Автоматическая проверка типов, мы не сможем случайно записать в нашу переменную адреса файла число, или скажем кортеж;
Мы можем запретить изменение нашего dataclass, для этого в декораторе укажите frozen=True. Тогда у нас действительно получиться неизменяемая константа;
Так как это класс, то мы можем написать методы для удобного взаимодействия с нашими переменными, что может сократить кол-во повторяющегося кода.
Используйте максимум возможностей ООП
Из всех разработчиков пишущих на Python, ООП использует процентов 40, правильно использует ООП процентов 20, а использует все его возможности процентов 5.
Попадите в эти 5%, ООП - это круто, это удобно, это надёжно.
Давайте кратко рассмотрим типичные проблемы в коде таких разработчиков:
Отсутствие абстракций. Это большая проблема, ведь абстракции позволяют нам писать программы не уходя в сторону и не реализуя бесполезный функционал (принцип YAGNI).
Пример кода с абстракцией:

Постоянное использование наследования. Если вам нужен кусочек функционала из другого класса, то вы, как нормальный человек, не захотите всё писать заново. Не очень опытные разработчики просто наследуют класс, даже если это никак не сочетающиеся сущности (К примеру: вертолёт и голубь). Чтобы решить эту проблему, используйте композицию или агрегацию, подробнее про них можно прочесть тут.
Боязнь классов-в-классе и мета-классов. Когда разработчики впервые видят классы в классе или мета-классы (например в Django), у них встают волосы дыбом и начинает дёргаться глаз, но совершенно напрасно, ведь это, на самом деле, позволяет упростить код.
Пример:

Подобные трюки с ООП не совсем типичны, но они позволяют значительно упростить процесс разработки, также такой код интересно писать и поддерживать.
Попробуйте кусочек функционального программирования
Как вы наверняка знаете, существует не только ООП, есть и другие парадигмы, среди них и ФП (функциональное программирование). В Python есть несколько функций из данной парадигмы, которые помогут немного упростить и сократить ваш код, рассмотрим на примере. Предположим, вам нужно перевести все данные из списка в строку, в классическом варианте это выглядит так:

Думаю вам этот способ знаком. Но для чего, если есть вариант проще?

Согласитесь, такой код гораздо проще и понятнее. Функция map лишь одна из представителей ФП.
Дескрипторы
Это достаточно сложная тема, но советую вам ее изучить по этим причинам:
С помощью дескрипторов можно автоматически проводить проверки, логировать, отправлять уведомления, вообщем всё что угодно.
Так что же такое дескрипторы? Дескрипторы позволяют нам добавлять любую логику при создании объекта в классе, путём создания этого объекта через промежуточный класс который и называется дескриптором (вы могли такое видеть например в Django). Вот пример использования и создания дескрипторов:

В этом коде видно использование дескриптора, мы говорим, что атрибуты price и quantity будут проверяться с помощью дескриптора NoNegative. Думаю название говорящие, этот дескриптор не позволит нам создать отрицательное число, что позволяет нам убрать эти проверки из __init__.
А вот и сам дескриптор:

Как видите, ничего сложного тут нет.
Декомпозируйте правильно
Я специально оставил эту тему для последнего, главного пункта.
Как же много разработчиков, знающих все описанные мною ранее темы, но при это всё равно пишущие ужасный код.
Такая грустная ситуация возникает именно из-за декомпозиции.
Для не знающих, декомпозиция - разделение большой задачи на ряд более простых. Такой подход поможет вам писать небольшие, элегантные, читаемые функции/классы/методы. Облегчит процесс тестирования. Упростит процесс сопровождения вашего кода другим разработчикам. Программист не умеющий или неправильно декомпозирующий, обречён писать трудный, монолитный, неподдерживаемый код.
Поэтому, первое чему вы должны научиться - декомпозиции, а потом уже всему описанному выше.