Библиотека attrs
Сравните attrs и dataclasses
«Библиотека attrs» — бесплатный урок Python Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.
Что такое attrs
attrs — сторонняя библиотека, которая задолго до появления dataclasses в стандартной библиотеке предложила идею создания класса из полей. Стандартный модуль dataclasses был непосредственно вдохновлён этой библиотекой.
- attrs устанавливается отдельно:
pip install attrs. - В ней больше возможностей, чем в dataclasses.
- dataclasses встроен в Python и покрывает большинство повседневных задач.
Современный интерфейс attrs
В современном attrs используются @define и field() из пространства имён attrs. Структура очень похожа на структуру класса данных.
from attrs import define, field
@define
class Point:
x: int
y: int
p = Point(1, 2)
print(p)Слоты по умолчанию
Есть важное отличие: классы @define автоматически используют __slots__. Это уменьшает потребление памяти и предотвращает случайное добавление необъявленных атрибутов. Обычные классы данных используют обычный __dict__, если не передать slots=True (Python 3.10+).
Встроенные средства проверки
attrs поставляется с готовыми средствами проверки. Для поля можно указать средство проверки, которое запускается во время создания объекта и выдаёт ошибку, если значение недопустимо. В dataclasses нет встроенной проверки — её нужно самостоятельно написать в __post_init__.
from attrs import define, field
from attrs.validators import instance_of
@define
class User:
age: int = field(validator=instance_of(int))
User(30) # ok
User('oops') # raises TypeErrorПреобразователи
Преобразователь изменяет входное значение до его сохранения. Например, он может автоматически преобразовать строку в целое число. Это ещё одна возможность, которой нет в dataclasses.
from attrs import define, field
@define
class Item:
price: int = field(converter=int)
i = Item('42') # stored as the integer 42
print(i.price)Аналог в dataclasses
Вот как выразить ту же идею с помощью стандартной библиотеки. Проверку и преобразование приходится вручную помещать в __post_init__, поскольку dataclasses не предоставляет механизмов для отдельных полей.
from dataclasses import dataclass
@dataclass
class Item:
price: int
def __post_init__(self):
self.price = int(self.price)
print(Item('42'))asdict в обеих библиотеках
Обе библиотеки предоставляют вспомогательную функцию asdict. В dataclasses она находится в модуле dataclasses, а в attrs — в модуле attrs. Поведение почти одинаково.
from dataclasses import dataclass, asdict
@dataclass
class Point:
x: int
y: int
print(asdict(Point(1, 2)))Неизменяемость в attrs
attrs также поддерживает неизменяемость. Используйте @frozen (сокращённую запись для @define(frozen=True)) для экземпляров, доступных только для чтения, по аналогии с @dataclass(frozen=True).
from attrs import frozen
@frozen
class Point:
x: int
y: int
p = Point(1, 2)
print(p)
# p.x = 9 would raise FrozenInstanceErrorСравнение возможностей
Вот как они соотносятся:
- dataclasses: стандартная библиотека, ничего устанавливать не нужно, покрывает основные случаи.
- attrs: средства проверки, преобразователи, слоты по умолчанию и больше возможностей настройки.
- Обе библиотеки генерируют
__init__,__repr__и__eq__.
Что выбрать
Выбирайте dataclasses для простых контейнеров данных, если не хотите добавлять зависимость. Выбирайте attrs, когда нужны средства проверки, преобразователи или более гибкая настройка и вы готовы добавить зависимость. Многие проекты начинают с dataclasses и переходят на другую библиотеку только тогда, когда возможностей dataclasses становится недостаточно.
Общее происхождение
Поскольку dataclasses многое заимствовал из attrs, переход между ними обычно выполняется механически: замените импорт и декоратор, а также настройте средства проверки или преобразователи. Зная одну библиотеку, вы сразу освоитесь с другой.
@defineсоответствует@dataclass.attrs.fieldсоответствуетdataclasses.field.- При переходе на dataclasses средства проверки переносятся в
__post_init__.
Быстрая проверка
Какая возможность есть у attrs, но отсутствует во встроенном модуле dataclasses?
Повторение
Вы сравнили attrs и dataclasses.
- attrs вдохновил создание dataclasses и предлагает больше возможностей.
- attrs добавляет средства проверки, преобразователи и слоты по умолчанию.
- dataclasses встроен в Python и не требует установки.
- Выбирайте самый простой инструмент, который отвечает вашим потребностям.
Часто задаваемые вопросы
Урок «Библиотека attrs» бесплатный?
Да — полный текст урока «Библиотека attrs» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.
Чему я научусь в уроке «Библиотека attrs»?
Сравните attrs и dataclasses Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Python Academy?
Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Библиотека attrs»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Python Academy?
Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Определение датакласса
- Значения по умолчанию и field()
- Параметры неизменяемости и сравнения
- Библиотека attrs