attrs es el paquete de Python que le devolverá el placer de escribir clases al liberarlo de la monotonía de implementar protocolos de objetos (también conocidos como métodos dunder). ¡Con la confianza de la NASA para misiones a Marte desde 2020!
Su objetivo principal es ayudarle a escribir software conciso y correcto sin ralentizar su código.
attrs no sería posible sin nuestros increíbles patrocinadores. Especialmente aquellos que nos apoyan generosamente en el nivel de La Organización y superiores:
¡Considere unirse a ellos para ayudar a que el mantenimiento de attrs sea más sostenible!
attrs le proporciona un decorador de clase y una forma de definir declarativamente los atributos de esa clase:
>>> 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')
Después de declarar tus atributos, attrs te da:
__repr__
legible por humanos,sin escribir código repetitivo aburrido una y otra vez y sin penalizaciones en el rendimiento del tiempo de ejecución.
Este ejemplo utiliza las API modernas de attrs que se introdujeron en la versión 20.1.0 y el nombre de importación del paquete attrs que se agregó en la versión 21.3.0. Las API clásicas ( @attr.s
, attr.ib
, más sus alias comerciales serios) y el nombre de importación del paquete attr
permanecerán indefinidamente .
¡Consulte On The Core API Names para obtener una explicación detallada!
¡Ningún problema! Los tipos son completamente opcionales con atributos . Simplemente asigne attrs.field()
a los atributos en lugar de anotarlos con tipos:
from attrs import define , field
@ define
class SomeClass :
a_number = field ( default = 42 )
list_of_numbers = field ( factory = list )
En la lata, los atributos pueden recordarle a dataclasses
(y, de hecho, dataclasses
son descendientes de los atributos ). En la práctica hace mucho más y es más flexible. Por ejemplo, le permite definir un manejo especial de matrices NumPy para verificaciones de igualdad, permite más formas de conectarse al proceso de inicialización, tiene un reemplazo para __init_subclass__
y permite recorrer los métodos generados usando un depurador.
Para obtener más detalles, consulte nuestra página de comparación, pero en términos generales, es más probable que cometamos crímenes contra la naturaleza para hacer que las cosas funcionen, lo que uno esperaría que funcionara, pero que son bastante complicados en la práctica.
python-attrs
en Stack OverflowDisponible como parte de la suscripción Tidelift.
Los mantenedores de attrs y miles de otros paquetes están trabajando con Tidelift para brindar soporte comercial y mantenimiento para los paquetes de código abierto que utiliza para crear sus aplicaciones. Ahorre tiempo, reduzca el riesgo y mejore la salud del código, mientras paga a los encargados del mantenimiento de los paquetes exactos que utiliza.