0Pricing
Python Academy · Урок

Библиотека 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 — локальная установка не требуется.

Все уроки этого курса

  1. Определение датакласса
  2. Значения по умолчанию и field()
  3. Параметры неизменяемости и сравнения
  4. Библиотека attrs
← Назад к Python Academy