DataClass в Python — это способ хранить и организовать связанные значения структурированным, многократным образом. Но разве у нас уже нет словари, переменные и классы, чтобы сделать это на Python? Зачем нам нужен обработка данных?
Введение
Вот разница:
- Переменная содержит одно значение (человек = «Джессика»).
- Словарь содержит несколько связанных значений в формате ключа (Person = {«name»: «Jessica», «AGE»: 30, «Email»: «jessica@example.com»}) и хорошо для специальных или одноразовых данных.
- Класс определяет план для объектов, которые могут содержать несколько значений и выполнять различные поведения.
- DataClass — это оптимизированный класс, предназначенный для сохранения соответствующих значений (например, пример человека в словаре) с минимальным кодом шаблона. Чтобы не путать с словарем, обработки данных похожи на регулярные занятия. Они чертежи для объектов Python.
На первый взгляд, датчик может очень похож на словарь. Практическое практическое правило: используйте словарь для одного объекта или когда структура является динамической. Используйте DataClass, когда вы хотите создать несколько структурированных объектов с одинаковыми полями.
Как данные обработки данных, так и пары словарного хранилища. DataClass-это напечатанный объект с доступом к точечной нотации, встроенными методами, такими как __init__ и __REPR__, и простое сравнение между экземплярами.
Даваки также могут выглядеть похоже на классы Python. Используйте DataClass через обычный класс Python, когда вы хотите сохранить связанные данные, а не реализовать сложное поведение.
Зачем использовать DataClasses
Перед введением DataClass в выпуске Python 3.7 разработчикам все еще необходимо создавать объекты с соответствующими данными. Самым популярным выбором для этого были обычные занятия, словари и названные. Но все трое принесли свои собственные недостатки. Занятия требовали много ненужного, повторяющегося кода шаблона. Словары не могли быть автогенерированы и не имели подсказок типа. Названные по умолчанию были неизменны, имели ограниченную гибкость, и добавление значений по умолчанию и методов было трудоемким.
Итак, разработчики Python создали решение: обработки данных.
Разработчики могут написать более декларативный, поддерживаемый код с обработкой данных. Они уменьшают шаблон, автогенерируя общие методы. Они применяют подсказки типа. Вы также можете добавить более продвинутые функции с минимальным синтаксисом (неизменность, упорядочение и эффективное использование памяти).
Быстрый старт: объявление вашего первого обработки данных
Декоратор @DataClass отмечает класс в качестве обработки данных, сигнализируя о том, что он будет использоваться для хранения структурированных данных.
Выход:
3
5
Точка (x = 3, y = 5)
Автоматический __init__, __repr__ и __eq__
DataClass поставляются с этими встроенными методами (именно поэтому вы не видите никакого кода, добавленного для них).
- __init__ Устанавливает поля объекта при его создании.
- __REPR__ дает читаемое представление строки объекта.
- __EQ__ позволяет сравнить два объекта по их значениям.
Определение полей и типов
В обратном данных вы определяете поля и их типы, перечисляя каждый атрибут с аннотацией типа внутри класса, например, x: int или name: str.
Требуется против дополнительных полей
По умолчанию обработки данных требуют все поля. Вы можете добавить значение или значение по умолчанию. Значение по умолчанию — это заданное значение, которое поле будет использовать, если вы не предоставите его при создании экземпляра. Значение по умолчанию может быть переопределено при создании экземпляра.
Выход:
Человек (имя = ‘jess’, возраст = 30)
Человек (имя = ‘dani’, возраст = 25)
Вы также можете сделать поле необязательным:
Типовые подсказки и статический анализ
Давакиса полагаются на подсказки типа. Подсказки типа — это аннотации, которые указывают ожидаемый тип данных переменной, параметр функции или возвращаемое значение в Python. Они выглядят так в кодовом названии: Str или возраст: Int. Типовые подсказки помогают уловить ошибки на ранних этапах статического анализа. Статический анализ использует такие инструменты, как Mypy и Ides, чтобы предупредить вас, если вы попытаетесь назначить значение неправильного типа. Это улучшает безопасность и читаемость кода.
Значения по умолчанию и default_factory
В Python использование изменяемого объекта (например, список или словаря) в качестве значения по умолчанию может вызвать неожиданное поведение, поскольку все экземпляры имеют один и тот же объект. Это называется изменчивой ловушкой по умолчанию. Чтобы предотвратить это, обработки данных предоставляют default_factory, который создает новый объект для каждого экземпляра:
Выход:
Участники команды1: [‘Leslie’]
Участники команды2: []
Идентификатор списка команды1: 4425609792
Идентификатор списка Team2: 4419089664
Контроль сгенерированных методов
Мы знаем, что обработки данных автоматически создают методы __init__, __repr__ и __eq__. Вы также можете настроить свой класс и контроль, какие методы генерируются и как они ведут себя.
Сравнения с порядком = true
@dataclass (order = true) генерирует методы сравнения, такие как <, <=,> и> = на основе порядка полей. Это позволяет легко сравнивать и сортировать экземпляры. Это полезно для списков объектов или приоритетов.
Выход:
Истинный
Истинный
[Item(price=5.49, name=’Pen’), Item(price=7.25, name=’Pencil’), Item(price=10.99, name=’Notebook’)]
Hashability и Frozen = True
Frozen = True делает экземпляры DataClass неизменными, что означает, что их поля не могут быть изменены после создания. Это также делает их хранением, поэтому их можно использовать в качестве словарных ключей или хранить в наборах. Это важно для создания безопасных, постоянных объектов, которые полагаются на стабильные значения.
Выход:
не может назначить поле «символ»
1.0
0,92
Настройка __post_init__
Метод __POST_INIT__ работает после инициализированного обработки данных, позволяя обеспечить соблюдение ограничений, проверять значения или выполнять дополнительную настройку. Это обеспечивает целостность данных без ручного написания инициализатора.
Выход:
Продукт (имя = ‘ноутбук’, цена = 1200,0)
Цена должна быть неотрицательной
Расширенные функции
DataClass предлагают еще несколько расширенных функций для повышения эффективности памяти, ясности кода и интеграции с современными функциями Python.
Слоты поддержка эффективности памяти
В Python 3.10+ вы можете использовать Slots = true, чтобы сообщить DataClass предопределить свои атрибуты, что уменьшает использование памяти и ускоряет доступ к атрибутам.
Поля только для ключевых слов (kw_only = true)
Использование kw_only = истинные силы, все поля должны быть переданы в качестве аргументов ключевых слов, улучшение ясности и предотвращение передачи ошибок в неправильном порядке.
Сопоставление рисунков с обработкой данных
Вы можете соответствовать объектам на основе их поля (выпущенного в 3.10), потому что обработки данных плавно интегрируются с сопоставлением структурных схем.
Наследство и микшины
Наследование и микшины позволяют классам повторно использовать или расширять поведение и функциональность от других классов, делая код более модульным и проще в обслуживании.
Расширение данных (наследование)
Если вы работали с занятиями раньше, этот будет знаком. Дата -образные данные могут наследовать поля и поведение от других классов, аналогичных классам родителей и детей. В приведенном ниже примере детский класс дисконтированный продукт автоматически наследует имя и цену от продукта, поэтому вам нужно только определить, что нового (в данном случае, это скидка).
Выход:
DiscountedProduct (name = ‘ноутбук’, цена = 1200,0, скидка = 150,0)
Смешивание регулярных и обработанных баз
Вы можете комбинировать обработки данных с регулярными классами, чтобы «смешать» дополнительное поведение и методы. Этот подход позволяет объединить удобство обработки данных с дополнительной функциональностью. Если вы решите смешать, вы должны знать о своем порядке разрешения метода (MRO). MRO определяет, какой метод используется, если несколько базовых классов определяют один и тот же метод.
Выход:
Журнал: встреча в 10:00
Производительность и соображения памяти
Давакиссы удобны, но они используют больше памяти на экземпляр, потому что каждый объект хранит свои атрибуты в динамическом __dict__. __dict__ — это словарь Python, который отображает имена атрибутов на их значения. __Dict__ позволяет динамическому назначению и модификации атрибутов (добавить, изменить или удалять атрибуты во время выполнения). Гибкость удобна, но требует дополнительной памяти для хранения структуры словаря. Накладные расходы поступают из Python, который нуждается в поддержании динамического отображения для атрибутов каждого экземпляра. Это делает DataClasses использовать больше памяти, чем фиксированное хранилище, например, кортежи или слоты.
Существует более легкое решение для приложений, нуждающихся в тысячах или миллионах объектов обработки данных. В этих случаях вы можете использовать слоты = верно для определения поля. Это устраняет __DICT__ и уменьшает использование памяти, когда ускоряет доступ к атрибутам.
Почему бы не использовать слоты = true для всех приложений? Слоты = True не улучшение Catchall; Это особенно полезно в приложениях, где память представляет собой беспокойство. При работе только с небольшим количеством объектов улучшение памяти и скорости будет незначительным. Вы не можете добавить новые атрибуты динамически; Все поля должны быть предопределены, что может быть ограничительным. Это также усложняет наследование классов, особенно если вы смешиваете прорезинты и нерасположенные классы.
Общие ловушки и ограничения изменяемые значения по умолчанию
Давакилы делятся по умолчанию во всех случаях. Это означает, что использование изменяющихся объектов в качестве значений по умолчанию может привести к неожиданному поведению. Чтобы избежать неожиданного поведения, используйте default_factory для создания нового объекта для каждого экземпляра. default_factory гарантирует, что каждый экземпляр имеет свой собственный независимый объект.
Рекурсивные типы
Рекурсивные обработки данных работают, но они делают типовые подсказки и статический анализ сложным и подверженным ошибкам. В рекурсии DataClasses могут иметь поля, которые ссылаются на их собственный тип, такие как связанные списки и деревья. Подсказки типа Python не автоматически разрешают рекурсивные типы во время выполнения. Это делает статический анализ сложным в этом случае. Вы можете использовать строковые аннотации или от __future__ импортных аннотаций для обойти это.
Реальные варианты использования
Давайте посмотрим на некоторые обработки данных в дикой природе.
Объекты конфигурации
Давакилы идеально подходят для представления структурированных настроек в приложении. Вместо словаря с произвольными ключами вы можете определить обработку данных с определенными полями, подсказками и дефолтами типа, что улучшает читабельность, безопасность и обслуживаемость.
Выход:
AppConfig (host = ‘localhost’, port = 5000, debug = true)
Легкие DTO в APIS
Объекты передачи данных (DTO) являются полезными нагрузками и ответами в веб -службах. И когда вы используете обработку данных для их создания, они предоставляют четкий, структурированный формат для данных без написания словесных классов. DTOS, построенные с помощью данных DATACLASS, легко интегрируются с библиотеками сериализации.
Выход:
Userdto (id = 1, name = ‘jess’, email=’jess@example.com ‘)
Необываемые доменные сущности
DataClass с Frozen = True позволяют легко определить непостоянные доменные объекты в системах, где важна неизменность, например, дизайн, управляемый доменом (DDD). Это предотвращает ошибки и обеспечивает соблюдение бизнес -логики, потому что объекты Frozen = true нельзя изменить после ее создания.
Выход:
не может назначить поле «код»
Тестирование и отладка обработки данных
DataClasses — это уникальный класс, но многие советы отладки соответствуют тем, которые вы увидите с любым другим инструментом Python.
- Подтвердовать рано: __post_init__ улавливает неверные значения, как только вы создаете объект.
- Печать легко: __REPR__ показывает все поля, чтобы вы могли видеть, что находится внутри объекта.
- Будьте осторожны с изменчивыми значениями, используйте замороженные классы (Frozen = true) при необходимости.
Заключение
Как и многие инструменты в Python, обработки данных могут показаться сложными, но с небольшой практикой они станут более управляемыми для работы. Они полезный инструмент для работы с несколькими экземплярами организованных данных. Как только вы почувствуете себя комфортно с ними, вы заметите, насколько чище и более читаемой ваш код становится. Они также помогают предотвратить общие ошибки, предоставляя структуру, подсказки типа и встроенные методы для сравнения и представления.
Trending Stories youtube.com/thenewstack Tech движется быстро, не пропустите эпизод. Подпишитесь на наш канал YouTube, чтобы транслировать все наши подкасты, интервью, демонстрации и многое другое. Группа подпишитесь с эскизом. Джессика Вахтел — писатель по маркетингу разработчиков в InfluxData, где она создает контент, который помогает сделать данные о мире временных рядов более понятными и доступными. Джессика имеет опыт работы в разработке программного обеспечения и технической журналистике. Подробнее от Джессики Вахтел