В рамках курса «Python Developer. Basic» подготовили для вас перевод полезного материала.Также приглашаем всех желающих на открытый вебинар по теме «Три кита: map(), filter() и zip()». Можно ли писать код, требующий циклов, но без циклов? Можно. Может ли он быть быстрее, чем, если бы мы использовали циклы в Python? Может. Для реализации задуманного понадобится знание слов "callback", "iterator" и "lambda". Будет сложно, но интересно. Присоединяйтесь.  Мы добавляем алгоритмы кластеризации с помощью пакетов scikit-learn, Keras и других в пакет Photonai. На 12 примерах мы покажем, как @dataclass улучшает код на Python. Для этого мы используем код из пакета Photonai для Machine Learning. Обновитесь до Python 3.7 или более поздней версии Декоратор @dataclass был добавлен в Python 3.7. Можно использовать Python 3.7 из Docker-образа, добавив в файл следующие команды /.bashrc_profile или /bashrc.txt. Если вы не можете найти файл /bashrc.txt создайте его самостоятельно с помощью touch/bashrc.txt. (в случае MacOS или одной из разновидностей операционных систем Linux или Unix.) Примечание: Не забудьте указать в качестве исходника ˜/.bashrc_profile или ˜/bashrc.txt, когда закончите их редактировать.  Здесь вы найдете более подробную информацию о реализации Docker, которой я пользуюсь.  Примечание: вы можете добавить код Docker в свой проект из клонируемого репозитория на GitHub. Python – язык с динамической типизацией. В версиях Python от 3.5 есть подсказки типов (PEP 484). Я подчеркиваю, что именно подсказки, поскольку они не влияют на работу интерпретатора Python. Насколько вам известно, интерпретатор Python вообще их игнорирует. Подсказки типов (обратите внимание, не строгая проверка типов) позволяют искать ошибки, находить дыры в безопасности и статически проверять типы после первого выполнения и при модульном тестировании. В Python 3.7 подсказки типов нужны для полей в определении класса при использовании декоратора @dataclass. Я добавляю подсказки типов во все приведенные примеры @dataclass. Если вы хотите узнать о них больше, рекомендую почитать: https://medium.com/swlh/future-proof-your-python-code-20ef2b75e9f5 https://realpython.com/python-type-checking/ https://docs.python.org/3/library/typing.html @dataclass был добавлен в Python 3.7. Основной движущей силой было желание избавиться от шаблонности, связанной с состоянием в определении класса def.  Классы могут существовать без состояния с одними лишь методами, но какой в этом смысл? Классы нужны для инкапсуляции состояния (полей данных) и методов, которые работают с полями данных. Если нет состояния, которое нужно инкапсулировать, можно преобразовать методы в функции. Примечание: Если вы не используете pandas, можно ускорить выполнение этих функции, с помощью быстрой вставки @jit из пакета numba. @dataclass декорирует определение класса def и автоматически генерирует 5 методов init(), repr(), str, eq(), и hash().  Примечание: он генерирует и другие методы, но об этом позже. Обратите внимание, что все эти 5 методов работают непосредственно с инкапсуляцией состояния класса. @dataclass практические полностью убирает повторяющийся шаблонный код, необходимый для определения базового класса. Пример коротенького класса в photon/photonai/base/hyperpipe.py, декорированный с помощью @dataclass. Пример 1, после декорации =>  Примечание: Если тип не является частью объявления, то поле игнорируется. Используйте тип any для подстановки типа, если он меняется или во время выполнения неизвестен. Сгенерировался ли код eq()? Пример 2, вывод => Да! А что насчет методов repr() и str? Пример , вывод => Да! А методы hash() и init? Пример 4, вывод => Да! Примечание: У сгенерированного метода init все еще сигнатура (X, y, kwargs). Кроме того, обратите внимание, что подсказки типов были проигнорированы интерпретатором Python 3.7. Примечание: У init(), repr(), str и eq() значение ключевого слова по умолчанию True, тогда как у hash() по умолчанию False. Вы можете использовать inspect также, как и для любого другого экземпляра. Пример 5, вывод => Круто! Более длинный пример из photon/photonai/base/hyperpipe.py Пример 6, после декорации => Пример 7, вывод => Пример 8, вывод => Пример 9, вывод =>     Пример 10, вывод => Пример 11, вывод => Очень круто! Упс, а что насчет: У нас есть переменные состояния, но они не создаются при вызове. Не волнуйтесь, @dataclass справится и с этим. Покажу в следующем разделе. Существует такой метод, как post-init, который является частью определения @dataclass. Метод post_init выполняется после init, сгенерированного @dataclass. Он включает обработку после установки состояния сигнатуры.  Мы завершаем преобразование установив оставшееся состояние CrossValidation: Источники     Здесь вы найдете отличные варианты использования декоратора @dataclass: https://realpython.com/python-data-classes/ https://blog.usejournal.com/new-buzzword-in-python-is-here-dataclasses-843dd1d372a5 На 12 примерах «до и после» я показал, как @dataclass преобразует классы в пакете Photonai Machine Learning. Мы видели, как @dataclass повысил производительность и читаемость кода.  Улучшение читаемости упрощает понимание кода на продакшене для всех. Вы лучше понимаете результаты, тестируете, допускаете меньше ошибок и меньше тратитесь на техническое обслуживание. Добавление @dataclass и подсказок типов демонстрирует, что Python продолжает расти и развиваться. Примечание: Вы можете добавить обновленный код Photonai в свой проект из клонируемого репозитория на GitHub. Я показал далеко не все возможности @dataclass. Поскольку мы только добавляем кластеризацию, я продолжу документировать изменения в photonai. Узнать подробнее о курсе «Python Developer. Basic».Смотреть открытый вебинар по теме «Три кита: map(), filter() и zip()». Редактор