0Pricing
Python Academy · レッスン

attrsライブラリ

attrsとdataclassesを比較します

「attrsライブラリ」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

attrsとは

attrsは、dataclassesが標準ライブラリに追加される何年も前に、フィールドからクラスを作るという考え方を先駆けて実現したサードパーティーライブラリです。標準のdataclassesモジュールは、直接その影響を受けています。

  • attrsは別途インストールします:pip install attrs。
  • dataclassesより多くの機能を提供します。
  • dataclassesは組み込みで、日常的な用途の大半をカバーします。

現代的なattrs API

現代的なattrsでは、attrs名前空間の@defineとfield()を使います。構造はデータクラスとよく似ています。

from attrs import define, field

@define
class Point:
    x: int
    y: int

p = Point(1, 2)
print(p)

デフォルトでスロットを使用

大きな違いの1つは、@defineクラスが自動的に__slots__を使うことです。これによりメモリ使用量が減り、宣言していない属性を誤って追加することも防げます。通常のデータクラスは、slots=True(Python 3.10以降)を渡さない限り、通常の__dict__を使います。

組み込みバリデータ

attrsにはすぐに使えるバリデータが付属しています。フィールドにバリデータを宣言すると、構築時に実行され、値が無効な場合は例外を発生させます。データクラスには組み込みのバリデーション機能がないため、__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

コンバータ

コンバータは、入力値を保存する前に変換します。たとえば、文字列を自動的に整数へ変換できます。これもデータクラスにはない機能です。

from attrs import define, field

@define
class Item:
    price: int = field(converter=int)

i = Item('42')   # stored as the integer 42
print(i.price)

データクラスでの同等の実装

同じ考え方を標準ライブラリで表すと、次のようになります。データクラスにはフィールドごとのフックがないため、バリデーションと変換は__post_init__に手作業で記述します。

from dataclasses import dataclass

@dataclass
class Item:
    price: int

    def __post_init__(self):
        self.price = int(self.price)

print(Item('42'))

両方のasdict

どちらのライブラリにもasdictヘルパーがあります。データクラス版は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を選びます。多くのプロジェクトでは、まずデータクラスから始め、必要な機能が不足した場合にのみ移行します。

共通の起源

データクラスはattrsから多くの要素を取り入れているため、両者の移行は通常、機械的に行えます。インポートとデコレータを置き換え、バリデータやコンバータを調整します。一方を知っていれば、もう一方もすぐに理解できます。

  • @defineは@dataclassに対応します。
  • attrs.fieldはdataclasses.fieldに対応します。
  • データクラスへ移行する場合、バリデータは__post_init__に移します。

確認問題

標準のdataclassesモジュールには組み込まれていない、attrsが提供する機能はどれですか。

まとめ

attrsとデータクラスを比較しました。

  • attrsはデータクラスに影響を与え、より多くの機能を提供します。
  • attrsはバリデータ、コンバータ、デフォルトのスロットを追加します。
  • データクラスは組み込みで、インストールは不要です。
  • 要件を満たす最もシンプルなツールを選びます。

よくある質問

「attrsライブラリ」レッスンは無料ですか?

はい。「attrsライブラリ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「attrsライブラリ」で何を学びますか?

attrsとdataclassesを比較します ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「attrsライブラリ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. データクラスを定義する
  2. デフォルト値とfield()
  3. Frozenと比較のオプション
  4. attrsライブラリ
← Python Academyに戻る