Как стать автором
Обновить

Комментарии 14

Три редко используемых возможности Python 3...

Вроде как классы и форматирование особенно изучаются в первые часы знакомства с Python.

Интересно было бы посмотреть на этого «сферического разработчика в вакууме» который не знаком с форматированием и классами. Какой же это «разработчик»? Ага, я не знаю как включить двигатели у самолета, но я уже «пилот», так что ли?
НЛО прилетело и опубликовало эту надпись здесь

Не просто классы, а dataclasses.
Не просто форматирование, но f-strings, которые всего как пару версий назад завезли.


Но соглашусь, что новой информации в статье нет, так как уже были статьи с раскрытием этих "фишек" питона.


По запросу "dataclasses" нашлось 22 публикации, включая эту.

Мне кажется, для такого простого и удобного инструмента как f-строки пара версий достаточный строк, чтобы о нем уже знало большинство разработчиков.
Ну так речь про форматирование через новый механизм fstrings, а не всем привычный format, практически уверен что в большинстве учебных заведений о нем не рассказывают(если вообще сами знают). Дата-классы тем более не изучаются в базовом курсе по языку.

Насчёт fstrings стоит также добавить, что этот способ поддерживает опции форматирования как метод format, а также работает быстрее этого метода и форматирования процентом (пример сравнения здесь).

И рядом с dataclass я бы ещё упомянул про namedtuple – функционал далеко не новый, но идейно схожий, тоже предоставляет лаконичный способ создания классов данных без написания однотипного кода конструктора и repr'a, и тоже используемый реже, чем стоило бы. Основное отличие от dataclass – данные в namedtuple неизменны после создания, зато имеется некоторый буст по скорости работы (т.к под капотом минималистичный кортеж, а не список/словарь) и используемой памяти (т.к имена полей не дублируются в кортежах, а хранятся только в классе). Есть ли что-то такое у dataclasses? Предполагаю, что может быть такая же оптимизация по памяти на основе единого места хранения имён полей.


Кстати любопытно, что синтаксис применения у них разный – namedtuple может создавать класс и являться родителем для твоего, а dataclass это декоратор, вероятно из-за того, что второй работает с типами. Можно ещё было бы пройтись по кейсам, где лучше применять один или дрогой тип, но возможно это и так очевидно.

Есть примеры с замерами про «с namedtuple имеется некоторый буст по скорости работы»?
например вот тут по тестам особой разницы нет, а памяти требует больше, насколько я понимаю.
Добавил бы про форматирование что там можно выполнять код прямо внутри скобок

>>> print(f'len = {len("abc")}')
len = 3
Но лучше так не делать. Вынести логику в строку до, внутри f-строки оставить только форматирование.
почему?
Если у меня там какой-то код который не трогает бизнес логику, зачем создавать лишние переменные?

Я например использую внутри вычисление длины списка, или там upper/lower или еще что, не меняющее исходные данные но создающее нужный мне вывод.

dataclasses Можно использовать только как dto ?

Можно, но неудобно сериализовать в json. Удобнее pydentic, но и в нем свои грабли в стиле превратим питончик в javascript. В итоге в питоне как было 100500 объединять данные в структуры так и осталось.

За Enum спасибо.
Насчет dataclasses, для меня наиболее привлекательна упрощенная конструкция, без необходимости в __init__ и __repr__.

Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории