«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему вам следует чаще использовать attrs

Почему вам следует чаще использовать attrs

Опубликовано 7 ноября 2024 г.
Просматривать:485

Why should you use attrs more

Введение

Библиотека attrs Python меняет правила игры для разработчиков, стремящихся упростить создание классов и сократить количество шаблонного кода. Этой библиотеке доверяет даже НАСА.
Созданный Хайнеком Шлаваком в 2015 году, attrs быстро стал любимым инструментом среди разработчиков Python благодаря своей способности автоматически генерировать специальные методы и предоставлять понятный, декларативный способ определения классов.
классы данных — это своего рода подмножество атрибутов.

Почему attrs полезен:

  • Уменьшает шаблонный код
  • Улучшает читаемость и удобство сопровождения кода
  • Предоставляет мощные функции для проверки и преобразования данных
  • Повышает производительность за счет оптимизированных реализаций

2. Начало работы с attrs

Установка:
Чтобы начать работу с attrs, вы можете установить его с помощью pip:

pip install attrs

Основное использование:
Вот простой пример того, как использовать attrs для определения класса:

import attr

@attr.s
class Person:
    name = attr.ib()
    age = attr.ib()

# Creating an instance
person = Person("Alice", 30)
print(person)  # Person(name='Alice', age=30)

3. Основные возможности attrs

а. Автоматическая генерация метода:

attrs автоматически генерирует методы init, repr и eq для ваших классов:

@attr.s
class Book:
    title = attr.ib()
    author = attr.ib()
    year = attr.ib()

book1 = Book("1984", "George Orwell", 1949)
book2 = Book("1984", "George Orwell", 1949)

print(book1)  # Book(title='1984', author='George Orwell', year=1949)
print(book1 == book2)  # True

б. Определение атрибута с типами и значениями по умолчанию:

import attr
from typing import List

@attr.s
class Library:
    name = attr.ib(type=str)
    books = attr.ib(type=List[str], default=attr.Factory(list))
    capacity = attr.ib(type=int, default=1000)

library = Library("City Library")
print(library)  # Library(name='City Library', books=[], capacity=1000)

в. Валидаторы и конвертеры:

import attr

def must_be_positive(instance, attribute, value):
    if value 



4. Расширенное использование

а. Настройка поведения атрибута:

import attr

@attr.s
class User:
    username = attr.ib()
    _password = attr.ib(repr=False)  # Exclude from repr

    @property
    def password(self):
        return self._password

    @password.setter
    def password(self, value):
        self._password = hash(value)  # Simple hashing for demonstration

user = User("alice", "secret123")
print(user)  # User(username='alice')

б. Замороженные экземпляры и слоты:

@attr.s(frozen=True) # slots=True is the default
class Point:
    x = attr.ib()
    y = attr.ib()

point = Point(1, 2)
try:
    point.x = 3  # This will raise an AttributeError
except AttributeError as e:
    print(e)  # can't set attribute

в. Заводские функции и обработка после инициализации:

import attr
import uuid

@attr.s
class Order:
    id = attr.ib(factory=uuid.uuid4)
    items = attr.ib(factory=list)
    total = attr.ib(init=False)

    def __attrs_post_init__(self):
        self.total = sum(item.price for item in self.items)

@attr.s
class Item:
    name = attr.ib()
    price = attr.ib(type=float)

order = Order(items=[Item("Book", 10.99), Item("Pen", 1.99)])
print(order)  # Order(id=UUID('...'), items=[Item(name='Book', price=10.99), Item(name='Pen', price=1.99)], total=12.98)

5. Лучшие практики и распространенные ошибки

Лучшие практики:

  • Используйте аннотации типов для лучшей читаемости кода и поддержки IDE
  • Используйте валидаторы для обеспечения целостности данных
  • Используйте замороженные классы для неизменяемых объектов
  • Воспользуйтесь преимуществами автоматической генерации методов, чтобы уменьшить дублирование кода

Распространенные ловушки:

  • Забыл использовать декоратор @attr.s в классе
  • Злоупотребление сложными валидаторами, которые могут быть отдельными методами
  • Не учитывая влияние на производительность широкого использования заводских функций

6. attrs против других библиотек

Библиотека Функции Производительность Сообщество
атрисы Автоматическая генерация методов, определение атрибутов с типами и значениями по умолчанию, валидаторы и преобразователи Более высокая производительность, чем при написании вручную Активное сообщество
пидантический Проверка данных и управление настройками, автоматическая генерация методов, определение атрибутов с типами и значениями по умолчанию, валидаторы и преобразователи Хорошее исполнение Активное сообщество
классы данных Встроено в Python 3.7, что делает их более доступными Привязано к версии Python Встроенная библиотека Python

attrs и классы данных работают быстрее, чем pydantic1.

Сравнение с классами данных:

  • attrs более многофункциональный и гибкий
  • классы данных встроены в Python 3.7, что делает их более доступными
  • attrs в большинстве случаев обеспечивает более высокую производительность
  • классы данных привязаны к версии Python, а attrs как внешнюю библиотеку можно использовать с любой версией Python.

Сравнение с пидантиком:

  • pydantic ориентирован на проверку данных и управление настройками
  • attrs более универсален и лучше интегрируется с существующими базами кода.
  • pydantic имеет встроенную сериализацию JSON, а attrs требует дополнительных библиотек

Когда выбирать атрибуты:

  • Для сложных иерархий классов с настраиваемым поведением
  • Когда вам нужен детальный контроль над определениями атрибутов
  • Для проектов, требующих совместимости с Python 2 (хотя сейчас это менее актуально)

7. Производительность и реальные приложения

Производительность:
attrs обычно обеспечивает более высокую производительность, чем написанные вручную классы или другие библиотеки, благодаря оптимизированной реализации.

Пример из реальной жизни:

from attr import define, Factory
from typing import List, Optional

@define
class Customer:
    id: int
    name: str
    email: str
    orders: List['Order'] = Factory(list)

@define
class Order:
    id: int
    customer_id: int
    total: float
    items: List['OrderItem'] = Factory(list)

@define
class OrderItem:
    id: int
    order_id: int
    product_id: int
    quantity: int
    price: float

@define
class Product:
    id: int
    name: str
    price: float
    description: Optional[str] = None

# Usage
customer = Customer(1, "Alice", "[email protected]")
product = Product(1, "Book", 29.99, "A great book")
order_item = OrderItem(1, 1, 1, 2, product.price)
order = Order(1, customer.id, 59.98, [order_item])
customer.orders.append(order)

print(customer)

8. Заключение и призыв к действию

attrs — это мощная библиотека, которая упрощает определения классов Python, предоставляя при этом надежные функции для проверки и манипулирования данными. Его способность сокращать шаблонный код, улучшать читаемость и повышать производительность делает его бесценным инструментом для разработчиков Python.

Ресурсы сообщества:

  • Репозиторий GitHub: https://github.com/python-attrs/attrs
  • Документация: https://www.attrs.org/
  • Страница PyPI: https://pypi.org/project/attrs/

Попробуйте attrs в своем следующем проекте и убедитесь в его преимуществах на собственном опыте. Поделитесь своим опытом с сообществом и внесите свой вклад в его постоянное развитие. Приятного кодирования!


  1. https://stefan.sofa-rockers.org/2020/05/29/attrs-dataclasses-pydantic/ ↩

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/soumendrak/why-should-you-use-attrs-more-4dim?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3