attrs — это пакет Python, который вернет радость от написания классов , освободив вас от рутинной работы по реализации объектных протоколов (также известных как методы dunder). НАСА доверяет миссии на Марс с 2020 года!
Его главная цель — помочь вам написать краткое и правильное программное обеспечение, не замедляя работу кода.
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__
,без повторного написания скучного шаблонного кода и без снижения производительности во время выполнения.
В этом примере используются современные API-интерфейсы attrs , представленные в версии 20.1.0, и имя импорта пакета attrs , добавленное в версии 21.3.0. Классические 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, чтобы обеспечить коммерческую поддержку и обслуживание пакетов с открытым исходным кодом, которые вы используете для создания своих приложений. Экономьте время, снижайте риски и улучшайте работоспособность кода, платя при этом разработчикам тех пакетов, которые вы используете.