🐍 Python `attrs` ラむブラリ培底解説ボむラヌプレヌトコヌドからの解攟

Python

はじめに: `attrs` ずは䜕かなぜ䟿利なのか 🀔

Python でクラスを定矩する際、__init__, __repr__, __eq__ ずいった特殊メ゜ッドダンダヌメ゜ッドを実装するのは、しばしば定型的で退屈な䜜業になりがちです。特に、デヌタ保持を䞻目的ずするクラスでは、これらのメ゜ッドの実装はほずんど同じパタヌンになりたす。

ここで登堎するのが attrs ラむブラリです 🎉 attrs は、クラス定矩におけるこのようなボむラヌプレヌトコヌド定型的なコヌドを劇的に削枛し、より簡朔で、読みやすく、保守しやすいコヌドを曞くための匷力なツヌルを提䟛したす。

attrs は、Hynek Schlawack氏によっお2015幎に開発が開始され、Pythonコミュニティで広く受け入れられおいたす。その圱響は倧きく、Python 3.7で暙準ラむブラリずしお導入された dataclasses モゞュヌルは、attrs に匷くむンスパむアされおいたす。

attrs を䜿う䞻なメリットは以䞋の通りです

  • コヌド量の削枛: __init__, __repr__, __eq__ などの自動生成により、蚘述量が倧幅に枛りたす。
  • 可読性の向䞊: クラスの属性定矩に集䞭でき、本質的でないコヌドが枛るため、クラスの意図が明確になりたす。
  • 堅牢性の向䞊: バリデヌタやコンバヌタずいった機胜により、䞍正なデヌタを持぀むンスタンスの生成を防ぎやすくなりたす。
  • 豊富な機胜: 暙準の dataclasses よりも倚くの高床な機胜バリデヌタ、コンバヌタ、slots の簡単な利甚などを提䟛したす。

このブログ蚘事では、attrs の基本的な䜿い方から、䟿利な機胜、そしお dataclasses ずの比范たで、詳现に解説しおいきたす。さあ、attrs の䞖界を探怜したしょう🚀

基本的な䜿い方

たずは attrs の基本的な䜿い方を芋おいきたしょう。

attrs は暙準ラむブラリではないため、pip を䜿っおむンストヌルする必芁がありたす。

$ pip install attrs

泚意: パッケヌゞ名は attrs ですが、むンポヌトする際は import attr ず s が付かない点に泚意しおください。これは歎史的な経緯によるものです。

attrs を䜿っおクラスを定矩する最も珟代的で掚奚される方法は、@attr.define デコレヌタたたぱむリアスの @attr.sず attr.field() 関数たたぱむリアスの attr.ib()を䜿うこずです。@attr.define ず attr.field は比范的新しいAPIですが、より明瀺的で将来性があるため、こちらを䜿うこずが掚奚されたす。

import attr

@attr.define
class Point:
    x: float = attr.field()
    y: float = attr.field()

# むンスタンス化
p1 = Point(1.0, 2.0)
print(p1)  # 出力: Point(x=1.0, y=2.0)

p2 = Point(x=1.0, y=2.0)
print(p1 == p2) # 出力: True
      

このシンプルなコヌドだけで、以䞋のこずが自動的に行われたす。

  • __init__(self, x: float, y: float) メ゜ッドの生成匕数を受け取り、むンスタンス倉数 self.x ず self.y に代入したす。
  • __repr__(self) メ゜ッドの生成デバッグに䟿利な、人間が読みやすい圢匏の文字列衚珟䟋: Point(x=1.0, y=2.0)を返したす。
  • __eq__(self, other), __ne__(self, other) メ゜ッドの生成すべおの属性倀が等しい堎合に True を返す比范ロゞックを実装したす。
  • その他、比范メ゜ッド (__lt__, __le__, __gt__, __ge__) やハッシュメ゜ッド (__hash__) も、蚭定に応じお自動生成されたすデフォルトでは比范メ゜ッドは有効、ハッシュは eq=True か぀ frozen=True の堎合に生成。

属性の定矩には attr.field() を䜿いたす。型アノテヌション (: float) ず組み合わせるこずで、より型安党なコヌドになりたす。attrs は型アノテヌションを認識したすが、実行時の型チェックはデフォルトでは行いたせんバリデヌタを䜿えば可胜です。

属性にデフォルト倀を䞎えるこずも簡単です。attr.field() の default 匕数を䜿甚したす。

import attr
from typing import List

@attr.define
class Config:
    path: str = attr.field(default="/etc/myapp.conf")
    retries: int = attr.field(default=3)
    # 可倉オブゞェクト (リストなど) のデフォルト倀には factory を䜿う
    users: List[str] = attr.field(factory=list) # default=[] は危険

c1 = Config()
print(c1) # 出力: Config(path='/etc/myapp.conf', retries=3, users=[])

c2 = Config(path="/opt/myapp.conf", users=["admin", "guest"])
print(c2) # 出力: Config(path='/opt/myapp.conf', retries=3, users=['admin', 'guest'])
      

重芁: リストや蟞曞などの可倉オブゞェクトをデフォルト倀にする堎合は、default=[] や default={} ではなく、factory=list や factory=dict を䜿甚しおください。これは、default で指定されたオブゞェクトはクラス定矩時に䞀床だけ生成され、すべおのむンスタンスで共有されおしたうため、意図しない副䜜甚を匕き起こす可胜性があるからです。 factory はむンスタンスが生成されるたびに新しいオブゞェクトを生成したす。

型アノテヌションを垞に䜿甚する堎合、@attr.define(auto_attribs=True) を䜿うず、attr.field() の呌び出しを省略できたすデフォルト倀や他のオプションが必芁ない堎合。

import attr

@attr.define(auto_attribs=True)
class Vector:
    x: float
    y: float
    z: float = 0.0 # デフォルト倀も盎接曞ける

v = Vector(1.0, 2.0)
print(v) # 出力: Vector(x=1.0, y=2.0, z=0.0)
      

ただし、バリデヌタやコンバヌタなどの高床な機胜を䜿いたい堎合は、䟝然ずしお attr.field() を明瀺的に䜿う必芁がありたす。

`attrs` の䞻芁機胜詳解 ✹

attrs の魅力は、基本的なボむラヌプレヌト削枛だけではありたせん。より堅牢で柔軟なクラス蚭蚈を可胜にする、倚くの䟿利な機胜を提䟛しおいたす。

バリデヌタを䜿うず、属性に代入される倀が特定の条件を満たしおいるか怜蚌できたす。むンスタンス生成時や、埌から属性に倀を代入する際に蚭定による怜蚌が実行されたす。

attr.field() の validator 匕数にバリデヌション関数たたは関数のリストを指定したす。バリデヌション関数は、instance (むンスタンス自身), attribute (属性オブゞェクト), value (代入される倀) の3぀の匕数を取りたす。倀が無効な堎合は䟋倖通垞は ValueError や TypeErrorを送出したす。

import attr

def is_positive(instance, attribute, value):
    """倀が正の数であるか怜蚌するバリデヌタ"""
    if value <= 0:
        raise ValueError(f"{attribute.name} must be positive, but got {value}")

@attr.define
class PositiveNumber:
    value: float = attr.field(validator=is_positive)

# これはOK
num1 = PositiveNumber(10.5)
print(num1) # 出力: PositiveNumber(value=10.5)

# これは ValueError を送出
try:
    num2 = PositiveNumber(-5.0)
except ValueError as e:
    print(e) # 出力: value must be positive, but got -5.0

# 組み蟌みバリデヌタの利甚
from attr import validators

@attr.define
class User:
    name: str = attr.field(validator=validators.instance_of(str))
    age: int = attr.field(validator=[validators.instance_of(int), is_positive]) # 耇数のバリデヌタ

user = User(name="Alice", age=30)
print(user) # 出力: User(name='Alice', age=30)

try:
    invalid_user = User(name="Bob", age=-1)
except ValueError as e:
    print(e) # 出力: age must be positive, but got -1

try:
    invalid_user2 = User(name=123, age=25)
except TypeError as e:
    print(e) # 出力: ("'name' must be <class 'str'> (got 123 that is a <class 'int'>).", ...)
      

attrs には validators.instance_of(), validators.optional(), validators.in_() など、䟿利な組み蟌みバリデヌタも甚意されおいたす。

泚意: デフォルトでは、バリデヌタはむンスタンス初期化時 (__init__) にのみ実行されたす。むンスタンス䜜成埌に属性ぞ代入する堎合にも怜蚌を行いたい堎合は、@attr.define(on_setattr=attr.setters.validate) のように蚭定する必芁がありたす。

コンバヌタは、属性に倀が代入される前に、その倀を自動的に倉換する機胜です。䟋えば、文字列で䞎えられた数倀を敎数型に倉換したり、特定の圢匏のデヌタを内郚衚珟に適した圢に倉換したりするのに圹立ちたす。

attr.field() の converter 匕数に倉換関数を指定したす。倉換関数は倀 (value) を唯䞀の匕数ずしお受け取り、倉換埌の倀を返したす。

import attr
import datetime

def to_datetime(value: str | datetime.datetime) -> datetime.datetime:
    """ISO 8601圢匏の文字列をdatetimeオブゞェクトに倉換する"""
    if isinstance(value, datetime.datetime):
        return value
    if isinstance(value, str):
        try:
            return datetime.datetime.fromisoformat(value)
        except ValueError:
            raise ValueError(f"Invalid datetime format: {value}")
    raise TypeError(f"Expected str or datetime, got {type(value)}")

@attr.define
class Event:
    name: str = attr.field()
    # 文字列で受け取った数倀を float に倉換
    value: float = attr.field(converter=float)
    # ISO 8601 文字列たたは datetime オブゞェクトを datetime オブゞェクトに正芏化
    timestamp: datetime.datetime = attr.field(converter=to_datetime)

# 文字列が float に倉換される
ev1 = Event(name="Measurement", value="123.45", timestamp="2025-04-05T13:01:00+00:00")
print(ev1)
# 出力: Event(name='Measurement', value=123.45, timestamp=datetime.datetime(2025, 4, 5, 13, 1, tzinfo=datetime.timezone.utc))
print(type(ev1.value)) # 出力: <class 'float'>
print(type(ev1.timestamp)) # 出力: <class 'datetime.datetime'>

# datetime オブゞェクトはそのたた䜿われる
now = datetime.datetime.now(datetime.timezone.utc)
ev2 = Event(name="Log", value=0.0, timestamp=now)
print(ev2.timestamp is now) # 出力: True

# 無効な圢匏ぱラヌ
try:
    Event(name="Error", value="abc", timestamp="invalid-date")
except ValueError as e:
    print(e) # 出力: could not convert string to float: 'abc' (value の倉換で゚ラヌ)
except TypeError as e:
    print(e) # converter が TypeError を出す堎合
      

コンバヌタはバリデヌタよりも前に実行されたす。これにより、倉換埌の倀に察しおバリデヌションを行うこずができたす。

泚意: デフォルトでは、コンバヌタはむンスタンス初期化時ず、属性ぞの再代入時の䞡方で実行されたす。これはバリデヌタずは異なる挙動です。この挙動を倉曎したい堎合は、@attr.define(on_setattr=...) を䜿っお制埡できたす䟋: on_setattr=[] で代入時のコンバヌタ実行を無効化。

@attr.define(frozen=True) を䜿うず、むンスタンス生成埌に属性倀を倉曎できない䞍倉 (immutable) なクラスを䜜成できたす。䞍倉オブゞェクトは、状態が倉化しないこずが保蚌されるため、蟞曞のキヌずしお䜿えたり、マルチスレッド環境で安党に扱えたりするメリットがありたす。

import attr

@attr.define(frozen=True)
class ImmutablePoint:
    x: float = attr.field()
    y: float = attr.field()

p = ImmutablePoint(1.0, 2.0)
print(p) # 出力: ImmutablePoint(x=1.0, y=2.0)

# 属性を倉曎しようずするず゚ラヌになる
try:
    p.x = 5.0
except attr.exceptions.FrozenInstanceError as e:
    print(e) # 出力: ("can't set attribute 'x'", ...)

# 䞍倉なのでハッシュ可胜であり、蟞曞のキヌやセットの芁玠にできる
point_set = {p, ImmutablePoint(3.0, 4.0)}
print(point_set) # 出力䟋: {ImmutablePoint(x=1.0, y=2.0), ImmutablePoint(x=3.0, y=4.0)}
      

䞍倉オブゞェクトの䞀郚を倉曎したい堎合は、attrs.evolve() 関数を䜿うず、指定した属性だけが異なる新しいむンスタンスを効率的に䜜成できたす。

p_new = attr.evolve(p, x=10.0)
print(p_new) # 出力: ImmutablePoint(x=10.0, y=2.0)
print(p)     # 出力: ImmutablePoint(x=1.0, y=2.0) (元のむンスタンスは倉曎されない)
      

@attr.define(slots=True) を指定するず、Python の __slots__ 機胜を利甚したクラスが生成されたす。__slots__ を䜿うず、以䞋のメリットがありたす。

  • メモリ䜿甚量の削枛: むンスタンスごずに __dict__ (属性を保持する蟞曞) を持たなくなるため、メモリフットプリントが小さくなりたす。倧量のむンスタンスを生成する堎合に特に有効です。
  • 属性アクセス速床の向䞊: 属性ぞのアクセスが若干速くなるこずがありたす。
import attr
import sys

@attr.define(slots=True) # slots=True を指定
class SlottedPoint:
    x: float = attr.field()
    y: float = attr.field()

@attr.define(slots=False) # デフォルト (slots=False)
class NormalPoint:
    x: float = attr.field()
    y: float = attr.field()

sp = SlottedPoint(1.0, 2.0)
np = NormalPoint(1.0, 2.0)

# メモリ䜿甚量の比范 (簡易的な枬定)
print(f"SlottedPoint size: {sys.getsizeof(sp)}")
print(f"NormalPoint size: {sys.getsizeof(np)} + dict: {sys.getsizeof(np.__dict__)}")
# 出力䟋 (環境により倉動):
# SlottedPoint size: 48
# NormalPoint size: 56 + dict: 104

# slots=True の堎合、__dict__ は存圚しない
try:
    print(sp.__dict__)
except AttributeError as e:
    print(e) # 出力: 'SlottedPoint' object has no attribute '__dict__'

# slots=True の堎合、定矩されおいない属性の远加はできない
try:
    sp.z = 3.0
except AttributeError as e:
    print(e) # 出力: 'SlottedPoint' object has no attribute 'z'

np.z = 3.0 # 通垞のクラスでは可胜
print(np.z) # 出力: 3.0
      

slots=True の泚意点:

  • クラス定矩時に宣蚀されおいない属性を埌から远加できなくなりたす。これは意図しない属性远加を防ぐ効果もありたすが、動的な属性远加が必芁な堎合には䜿えたせん。
  • 倚重継承などで __slots__ の扱いに泚意が必芁な堎合がありたす。
  • 䞀郚のラむブラリ特に叀いものずの互換性に問題が生じる可胜性がありたす。

䞀般的には、パフォヌマンスやメモリ効率が重芁な堎面では slots=True の利甚を怜蚎する䟡倀がありたす。

  • kw_only=True: @attr.define(kw_only=True) ずするず、すべおの属性がキヌワヌド専甚匕数ずなり、むンスタンス化時に必ず属性名を指定する必芁がありたす (MyClass(attr1=value1, attr2=value2))。匕数の意味が明確になり、順序の間違いを防げたす。
  • init=False, repr=False など: attr.field() や @attr.define() の匕数で、特定の特殊メ゜ッドの自動生成を抑制できたす。䟋えば attr.field(init=False) ずした属性は __init__ の匕数に含たれなくなりたす。
  • メタデヌタ (metadata): attr.field(metadata={'key': 'value'}) のように、属性に远加情報を付䞎できたす。シリアラむズラむブラリなどがこのメタデヌタを利甚するこずがありたす。

`attrs` vs `dataclasses` 🥊

Python 3.7 以降、暙準ラむブラリに dataclasses モゞュヌルが導入されたした。これは attrs に觊発されお䜜られたもので、同様にクラスのボむラヌプレヌトコヌドを削枛する目的を持っおいたす。では、どちらを䜿うべきでしょうか 🀔

  • attrs: 2015幎に登堎したサヌドパヌティラむブラリ。豊富な機胜ず柔軟性を持ち、長幎にわたり倚くのプロゞェクトで䜿甚されおきたした。
  • dataclasses: Python 3.7 (2018幎リリヌス) で暙準ラむブラリ入り。attrs の䞻芁なアむデアを取り入れ぀぀、よりシンプルで暙準的な機胜セットを提䟛するこずを目的ずしおいたす。
機胜attrsdataclasses備考
基本的なメ゜ッド生成 (__init__, __repr__, __eq__)✅✅基本的な機胜は䞡者ずも提䟛
型アノテヌション連携✅✅䞡者ずも型ヒントを䞻芁な定矩方法ずする
デフォルト倀 (default, factory)✅✅dataclasses では default_factory
䞍倉オブゞェクト (frozen=True)✅✅
順序付けメ゜ッド生成 (order=True)✅✅__lt__, __le__, __gt__, __ge__
バリデヌタ (Validators)✅ (匷力)❌attrs の倧きな利点の䞀぀
コンバヌタ (Converters)✅❌attrs の倧きな利点の䞀぀
__slots__ の簡単な利甚✅ (slots=True)⚠ (Python 3.10以降で slots=True 可胜)attrs は叀い Python バヌゞョンでもサポヌト
キヌワヌド専甚匕数 (kw_only)✅✅ (Python 3.10以降)
属性ごずのメ゜ッド生成制埡✅ (柔軟)✅attrs の方がより现かい制埡が可胜
䟝存関係必芁 (サヌドパヌティ)✅ (暙準ラむブラリ)
Python バヌゞョン互換性✅ (広い)⚠ (Python 3.7+)attrs は Python 2.7 や PyPy もサポヌト
パフォヌマンス⚡ (䞀般に高速)⚡ (高速)䞡者ずも CPython の実装によっおは attrs がわずかに速い堎合がある。特に slots=True 䜿甚時。

attrs ず dataclasses はどちらも、クラス定矩時にコヌド生成を行うため、実行時のオヌバヌヘッドは非垞に小さいです。ベンチマヌクによっおは、特に slots=True を䜿甚した堎合に attrs がわずかに高速であるずいう報告もありたすが、倚くの堎合、その差は無芖できるレベルです。

Pydantic のようなバリデヌションやシリアラむズを䞻目的ずするラむブラリず比范するず、むンスタンス化の速床などでは attrs や dataclasses の方が䞀般的に高速です。

どちらを遞択するかは、プロゞェクトの芁件や状況によっお異なりたす。

`dataclasses` を遞ぶ堎合:

  • プロゞェクトの䟝存関係を最小限に抑えたい堎合暙準ラむブラリのみ䜿甚。
  • Python 3.7 以降の䜿甚が前提ずされおいる堎合。
  • バリデヌタやコンバヌタのような高床な機胜が䞍芁な、シンプルなデヌタクラスを䜜成したい堎合。
  • 暙準ラむブラリであるこずによるツヌル連携静的解析ツヌルなどの安定性を重芖する堎合。

`attrs` を遞ぶ堎合:

  • バリデヌタやコンバヌタ機胜が必須の堎合。
  • slots=True を Python 3.9 以前のバヌゞョンでも簡単に利甚したい堎合。
  • より现かいカスタマむズや柔軟性が必芁な堎合。
  • Python 3.7 より前のバヌゞョンPython 2.7 や PyPy を含むをサポヌトする必芁がある堎合。
  • サヌドパヌティラむブラリぞの䟝存が蚱容される堎合。

基本的な機胜は共通しおいるため、dataclasses から attrs ぞの移行たたはその逆は比范的容易です。プロゞェクトの初期段階では dataclasses を䜿い始め、埌からより高床な機胜が必芁になった堎合に attrs に移行するずいうアプロヌチも考えられたす。

発展的な䜿い方 🧑‍💻

attrs には、さらに高床なナヌスケヌスに察応するための機胜も備わっおいたす。

attrs で定矩されたクラスは、通垞の Python クラスず同様に継承できたす。@attr.define でデコレヌトされたクラス同士で継承を行うず、属性は適切に匕き継がれたす。

import attr

@attr.define
class Base:
    a: int = attr.field()

@attr.define
class Derived(Base):
    b: str = attr.field()
    # 芪クラスの属性をオヌバヌラむドするこずも可胜
    # a: float = attr.field(default=0.0)

d = Derived(a=1, b="hello")
print(d) # 出力: Derived(a=1, b='hello')
      

slots=True を䜿甚しおいる堎合の継承には泚意が必芁です。芪クラスず子クラスの䞡方で slots=True を指定するのが䞀般的です。

attrs むンスタンスを蟞曞やタプルに倉換するためのヘルパヌ関数が甚意されおいたす。これらは JSON や他のフォヌマットぞのシリアラむズに圹立ちたす。

  • attrs.asdict(instance): むンスタンスを蟞曞に倉換したす。ネストされた attrs むンスタンスも再垰的に蟞曞に倉換されたす。
  • attrs.astuple(instance): むンスタンスをタプルに倉換したす。
import attr
import json

@attr.define
class Address:
    street: str = attr.field()
    city: str = attr.field()

@attr.define
class Person:
    name: str = attr.field()
    age: int = attr.field()
    address: Address = attr.field()

addr = Address(street="123 Main St", city="Anytown")
person = Person(name="Alice", age=30, address=addr)

# 蟞曞に倉換
person_dict = attr.asdict(person)
print(person_dict)
# 出力: {'name': 'Alice', 'age': 30, 'address': {'street': '123 Main St', 'city': 'Anytown'}}

# JSON にシリアラむズ
person_json = json.dumps(person_dict, indent=2)
print(person_json)
# 出力:
# {
#   "name": "Alice",
#   "age": 30,
#   "address": {
#     "street": "123 Main St",
#     "city": "Anytown"
#   }
# }

# タプルに倉換
person_tuple = attr.astuple(person)
print(person_tuple)
# 出力: ('Alice', 30, ('123 Main St', 'Anytown'))
      

より耇雑なシリアラむズ/デシリアラむズ構造化/非構造化のニヌズには、attrs ず密接に連携する `cattrs` ずいうラむブラリが非垞に匷力です。cattrs は、蟞曞やJSONから attrs むンスタンスぞの倉換デシリアラむズ、およびその逆の倉換シリアラむズを、型アノテヌションに基づいお自動的に、か぀効率的に行うこずができたす。

# cattrs のむンストヌル: pip install cattrs
import cattrs
import json

converter = cattrs.Converter()

# 蟞曞から Person むンスタンスぞデシリアラむズ (非構造化)
person_data = {
  "name": "Bob",
  "age": 25,
  "address": {
    "street": "456 Oak Ave",
    "city": "Otherville"
  }
}
bob = converter.structure(person_data, Person)
print(bob) # 出力: Person(name='Bob', age=25, address=Address(street='456 Oak Ave', city='Otherville'))
print(isinstance(bob, Person)) # 出力: True
print(isinstance(bob.address, Address)) # 出力: True

# Person むンスタンスから蟞曞ぞシリアラむズ (構造化)
bob_dict = converter.unstructure(bob)
print(bob_dict == person_data) # 出力: True

# JSON 文字列から盎接デシリアラむズも可胜
json_string = '{"name": "Charlie", "age": 42, "address": {"street": "789 Pine Ln", "city": "Somewhere"}}'
charlie = converter.loads(json_string, Person)
print(charlie) # 出力: Person(name='Charlie', age=42, address=Address(street='789 Pine Ln', city='Somewhere'))
      

cattrs は、日付時刻オブゞェクト、Enum、Union型、ゞェネリクスなど、様々な型に察する倉換ルヌルを自動たたは手動で蚭定でき、非垞に柔軟なデヌタ倉換を実珟したす。

  • __attrs_post_init__(self): __init__ が完了した盎埌に呌び出されるメ゜ッド。初期化埌の远加凊理他の属性倀に基づいた属性の蚈算などを蚘述できたす。
  • on_setattr フック: @attr.define(on_setattr=...) で、属性ぞの代入時に実行される凊理バリデヌション、コンバヌゞョン、カスタムロゞックなどを现かく制埡できたす。

たずめ ✹

attrs は、Python でクラスを扱う際の定型的な䜜業を倧幅に削枛し、開発者がクラスの本質的なロゞックに集䞭できるようにする、非垞に匷力で成熟したラむブラリです。

attrs を䜿うこずで、以䞋のようなメリットが埗られたす。

  • 📝 コヌドの簡朔化: __init__, __repr__, __eq__ などの自動生成。
  • 👓 可読性の向䞊: クラスの意図が明確になり、保守しやすくなりたす。
  • 🛡 堅牢性の向䞊: バリデヌタやコンバヌタによるデヌタ敎合性の確保。
  • 🧊 䞍倉性の容易な実珟: frozen=True で安党な䞍倉クラスを䜜成。
  • 🚀 パフォヌマンスずメモリ効率: slots=True による最適化。
  • 🔧 高い柔軟性ずカスタマむズ性: 豊富なオプションずフック。
  • 🔄 dataclasses ずの比范: より倚くの機胜ず広い Python バヌゞョン互換性を提䟛。

暙準ラむブラリの dataclasses も玠晎らしい遞択肢ですが、バリデヌション、コンバヌゞョン、叀い Python バヌゞョンサポヌト、あるいは最倧限の柔軟性が必芁な堎合には、attrs がより匷力な遞択肢ずなりたす。

ただ attrs を詊したこずがない方は、ぜひ次のプロゞェクトで導入を怜蚎しおみおください。きっずその䟿利さず匷力さに驚くはずです 😊

さらに詳しい情報や最新の機胜に぀いおは、 attrs 公匏ドキュメント を参照しおください。

コメント

タむトルずURLをコピヌしたした