attrs ist das Python-Paket, das Ihnen die Freude am Schreiben von Klassen zurückbringt, indem es Sie von der mühsamen Implementierung von Objektprotokollen (auch bekannt als Dunder-Methoden) befreit. Die NASA vertraut ihr bei Marsmissionen seit 2020!
Sein Hauptziel besteht darin, Ihnen dabei zu helfen, präzise und korrekte Software zu schreiben, ohne Ihren Code zu verlangsamen.
Ohne unsere großartigen Sponsoren wäre attrs nicht möglich. Besonders diejenigen, die uns auf der Organisationsebene und höher großzügig unterstützen:
Bitte denken Sie darüber nach, sich ihnen anzuschließen, um die Instandhaltung von attrs nachhaltiger zu gestalten!
attrs bietet Ihnen einen Klassendekorator und eine Möglichkeit, die Attribute dieser Klasse deklarativ zu definieren:
>>> 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')
Nachdem Sie Ihre Attribute deklariert haben , gibt Ihnen attrs Folgendes:
__repr__
,ohne immer wieder langweiligen Boilerplate-Code zu schreiben und ohne Einbußen bei der Laufzeitleistung.
In diesem Beispiel werden die modernen APIs von attrs verwendet, die in Version 20.1.0 eingeführt wurden, und der Paketimportname attrs , der in Version 21.3.0 hinzugefügt wurde. Die klassischen APIs ( @attr.s
, attr.ib
sowie ihre Aliase für seriöse Unternehmen) und der Name attr
Paketimports bleiben auf unbestimmte Zeit erhalten.
Schauen Sie sich On The Core API Names für eine ausführliche Erklärung an!
Kein Problem! Typen sind bei attrs völlig optional . Weisen Sie den Attributen einfach attrs.field()
zu, anstatt sie mit Typen zu kommentieren:
from attrs import define , field
@ define
class SomeClass :
a_number = field ( default = 42 )
list_of_numbers = field ( factory = list )
Auf den ersten Blick erinnern Sie attrs möglicherweise an dataclasses
(und tatsächlich sind dataclasses
ein Nachkomme von attrs ). In der Praxis leistet es viel mehr und ist flexibler. Es ermöglicht Ihnen beispielsweise, eine spezielle Behandlung von NumPy-Arrays für Gleichheitsprüfungen zu definieren, bietet mehr Möglichkeiten zur Einbindung in den Initialisierungsprozess, verfügt über einen Ersatz für __init_subclass__
und ermöglicht das schrittweise Durchlaufen der generierten Methoden mithilfe eines Debuggers.
Weitere Einzelheiten finden Sie auf unserer Vergleichsseite. Im Allgemeinen begehen wir jedoch eher Verbrechen gegen die Natur, damit Dinge funktionieren, von denen man erwarten würde, dass sie funktionieren, die aber in der Praxis recht kompliziert sind.
python-attrs
-Tag für Stack OverflowVerfügbar als Teil des Tidelift-Abonnements.
Die Betreuer von attrs und Tausenden anderer Pakete arbeiten mit Tidelift zusammen, um kommerziellen Support und Wartung für die Open-Source-Pakete bereitzustellen, die Sie zum Erstellen Ihrer Anwendungen verwenden. Sparen Sie Zeit, reduzieren Sie Risiken und verbessern Sie den Zustand des Codes, während Sie gleichzeitig die Betreuer genau der Pakete bezahlen, die Sie verwenden.