「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > attrs をもっと使用する必要がある理由

attrs をもっと使用する必要がある理由

2024 年 11 月 7 日に公開
ブラウズ:494

Why should you use attrs more

導入

Python の attrs ライブラリは、クラスの作成を簡素化し、定型コードを削減したいと考えている開発者にとって状況を大きく変えるものです。このライブラリは NASA からも信頼されています。
2015 年に Hynek Schlawack によって作成された attrs は、特別なメソッドを自動的に生成し、クラスを定義するクリーンで宣言的な方法を提供する機能により、すぐに Python 開発者の間で人気のツールになりました。
dataclasses は attrs.

のサブセットの一種です。

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 の主要な機能

a.メソッドの自動生成:

attrs は、クラスの initrepr、および 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

b.タイプとデフォルト値を含む属性定義:

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)

c.バリデーターとコンバーター:

import attr

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



4. 高度な使い方

a.属性の動作をカスタマイズする:

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')

b.凍結されたインスタンスとスロット:

@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

c.ファクトリー関数と初期化後の処理:

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 ライブラリ

属性とデータクラスは pydantic1.

より高速です。

データクラスとの比較:

  • attrs は機能が豊富で柔軟性が高くなります
  • データクラスは Python 3.7 に組み込まれており、アクセスしやすくなっています
  • ほとんどの場合、attrs のパフォーマンスが向上します
  • データクラスは Python バージョンに関連付けられていますが、外部ライブラリとしての attrs は任意の Python バージョンで使用できます。

pydantic との比較:

  • 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