attrs は、オブジェクト プロトコル (別名ダンダー メソッド) を実装するという単調な作業からユーザーを解放し、クラスを作成する喜びを取り戻してくれる Python パッケージです。 2020 年以降、NASA によって火星ミッションで信頼されています。
その主な目的は、コードの速度を低下させることなく、簡潔で正しいソフトウェアを作成できるようにすることです。
attrs は素晴らしいスポンサーなしでは不可能です。特に組織層以上で私たちを寛大にサポートしてくださっている方々:
attrsのメンテナンスをより持続可能なものにするために、ぜひ参加を検討してください。
attrs はクラス デコレーターと、そのクラスの属性を宣言的に定義する方法を提供します。
>>> from attrs import asdict, define, make_class, Factory
>>> @ define
... class SomeClass :
... a_number: int = 42
... list_of_numbers: list[ int ] = Factory( list )
...
... def hard_math ( self , another_number ):
... return self .a_number + sum ( self .list_of_numbers) * another_number
>>> sc = SomeClass( 1 , [ 1 , 2 , 3 ])
>>> sc
SomeClass(a_number=1, list_of_numbers=[1, 2, 3])
>>> sc.hard_math( 3 )
19
>>> sc == SomeClass( 1 , [ 1 , 2 , 3 ])
True
>>> sc != SomeClass( 2 , [ 3 , 2 , 1 ])
True
>>> asdict(sc)
{'a_number': 1, 'list_of_numbers': [1, 2, 3]}
>>> SomeClass()
SomeClass(a_number=42, list_of_numbers=[])
>>> C = make_class( " C " , [ " a " , " b " ])
>>> C( " foo " , " bar " )
C(a='foo', b='bar')
属性を宣言すると、 attrs によって次のものが得られます。
__repr__
、退屈な定型コードを何度も書く必要がなく、実行時のパフォーマンスが低下することもありません。
この例では、バージョン 20.1.0 で導入されたattrsの最新 API と、バージョン 21.3.0 で追加されたattrsパッケージのインポート名を使用します。クラシック API ( @attr.s
、 attr.ib
、およびそれらの重要なビジネス エイリアス) とattr
パッケージのインポート名は無期限に残ります。
詳細な説明については、「コア API 名について」を参照してください。
問題ない! attrsではタイプは完全にオプションです。属性に型の注釈を付けるのではなく、単純にattrs.field()
属性に割り当てます。
from attrs import define , field
@ define
class SomeClass :
a_number = field ( default = 42 )
list_of_numbers = field ( factory = list )
attrsというとdataclasses
を思い出すかもしれません (実際、 dataclasses
はattrsの子孫です)。実際には、より多くの機能があり、より柔軟です。たとえば、等価性チェックのための NumPy 配列の特別な処理を定義でき、初期化プロセスにプラグインするためのより多くの方法が可能になり、 __init_subclass__
の置き換えが可能になり、デバッガを使用して生成されたメソッドをステップ実行できるようになります。
詳細については、比較ページを参照してください。一般的に、私たちは、期待どおりに機能するようにするために、自然に対する犯罪を犯す可能性が高くなりますが、実際には非常に複雑です。
python-attrs
タグを使用しますTidelift サブスクリプションの一部として利用できます。
attrsや他の何千ものパッケージのメンテナは、Tidelift と協力して、アプリケーションの構築に使用するオープン ソース パッケージに商用サポートとメンテナンスを提供しています。使用するパッケージそのもののメンテナーに料金を支払いながら、時間を節約し、リスクを軽減し、コードの健全性を向上させます。