attrs é o pacote Python que trará de volta a alegria de escrever aulas , aliviando você do trabalho penoso de implementar protocolos de objetos (também conhecidos como métodos dunder). Confiado pela NASA para missões a Marte desde 2020!
Seu principal objetivo é ajudá-lo a escrever software conciso e correto sem deixar seu código lento.
attrs não seria possível sem nossos patrocinadores incríveis. Especialmente aqueles que nos apoiam generosamente no nível da Organização e superiores:
Por favor, considere juntar-se a eles para ajudar a tornar a manutenção do attrs mais sustentável!
attrs fornece um decorador de classe e uma maneira de definir declarativamente os atributos dessa classe:
>>> 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')
Depois de declarar seus atributos, attrs fornece:
__repr__
legível por humanos,sem escrever código padrão repetidamente e sem penalidades de desempenho em tempo de execução.
Este exemplo usa as APIs modernas de attrs que foram introduzidas na versão 20.1.0 e o nome de importação do pacote attrs que foi adicionado na versão 21.3.0. As APIs clássicas ( @attr.s
, attr.ib
, mais seus aliases de negócios sérios) e o nome de importação do pacote attr
permanecerão indefinidamente .
Confira On The Core API Names para uma explicação detalhada!
Sem problemas! Os tipos são totalmente opcionais com attrs . Simplesmente atribua attrs.field()
aos atributos em vez de anotá-los com tipos:
from attrs import define , field
@ define
class SomeClass :
a_number = field ( default = 42 )
list_of_numbers = field ( factory = list )
Na lata, attrs pode lembrá-lo de dataclasses
(e, de fato, dataclasses
são descendentes de attrs ). Na prática, faz muito mais e é mais flexível. Por exemplo, ele permite definir manipulação especial de matrizes NumPy para verificações de igualdade, permite mais maneiras de conectar-se ao processo de inicialização, substitui __init_subclass__
e permite percorrer os métodos gerados usando um depurador.
Para mais detalhes, consulte a nossa página de comparação, mas de um modo geral, é mais provável que cometemos crimes contra a natureza para fazer funcionar coisas que seria de esperar que funcionassem, mas que são bastante complicadas na prática.
python-attrs
no Stack OverflowDisponível como parte da assinatura Tidelift.
Os mantenedores do attrs e de milhares de outros pacotes estão trabalhando com o Tidelift para fornecer suporte comercial e manutenção para os pacotes de código aberto que você usa para construir seus aplicativos. Economize tempo, reduza riscos e melhore a integridade do código, pagando aos mantenedores dos pacotes exatos que você usa.