Python attrs: è un package Python che permette di creare classi, in particolare data classes e come funziona lo scopriamo assieme in questo articolo!
attrs è come abbiamo già detto un package Python che permette di gestire le classi, ma soprattutto le data classes in maniera pratica, rapida e precisa. Ha ovviamente come i pacchetti Python più usati la sua documentazione.
Ciao mi chiamo Lorenzo Neri e sono un informatico: realizzo contenuti per aiutare le persone a padroneggiare l’arte del nuovo millennio, ovvero l’informatica!
Per iniziare a capire come funziona “attrs”, è opportuno capire come iniziare.
Installazione
L’installazione avviene sempre tramite PyPI e pip:
python -m pip install attrs
A questo punto, siamo pronti ad usare attrs: ma è giusto fare un’introduzione approfondita al suo funzionamento.
attrs: abbiamo visto che cos’è, ma come funziona?
Questo pacchetto fa un forte uso di decoratori da usare direttamente sulle classi che hai intenzione di creare.
In particolare il decoratore “@attr.s” usato per dichiarare una classe.
All’interno della classe, utilizzeremo il metodo “attr.ib” che è il punto più magico del funzionamento di questo pacchetto.
Certamente, ti spiego.
In estrema sintesi, quando creiamo una classe, in linea di massima, la impostiamo con degli attributi.
Bene, quando creiamo un’istanza di questa classe, ne vogliamo valorizzare gli attributi in linea generale.
Ciò che facciamo di solito, nel costruttore della classe, è specificare questi attributi come argomenti del costruttore stesso.
Bene, con attrs NON lo dobbiamo fare.
Ciò che intendo dire è questo: attrs si occupa di gestire l’ordine degli attributi in maniera automatica e, al contempo anche dei nomi stessi.
Andiamo con un esempio terra-terra:
import attr
# inizializzo la classe
@attr.s
class Classe1(object):
# vado a prendere gli attributi che ho intenzione di impostare per le istanze della mia classe
x = attr.ib()
y = attr.ib()
Se ci hai fatto caso, la classe è stata “decorata” con il decorator di cui ho parlato prima, ma non ho creato alcun costruttore.
Al contempo, utilizzo il metodo “attr.ib” per prendere i parametri della classe stessa con cui valorizzo l’istanza.
Ovviamente, per capire questo meccanismo, procediamo con il nostro esempio:
# creo un'istanza
istanza1 = Classe1(3,4)
Ciò che avviene “per magia”, è che gli attributi “x” ed “y” sono automaticamente assegnati secondo l’ordine con cui abbiamo fatto l’associazione dentro la classe.
Perciò, “x” avrà il valore “3” mentre “y” il valore “4”.
Di fatto:
print(istanza1.x)
>>> 3
print(istanza1.y)
>>> 4
Ora che abbiamo capito che cos’è e come funziona attrs, approfondiamo alcuni dettagli interessanti.
Attributi privati
Con attrs, possiamo certamente impostare attributi privati all’interno della classe.
Per poterlo fare, attrs fa uso dell’underscore, ovvero:
# creo la classe
@attr.s
class LaMiaClasse(object):
_parametroPrivato = attr.ib()
Inizializzare gli attributi
Possiamo certamente inizializzare gli attributi di default:
import attr
# inizializzo la classe
@attr.s
class Classe1(object):
x = attr.ib()
# imposto un valore di default
y = attr.ib(default=30)
attrs: attributi “keyword-only”
Possiamo anche sfruttare senza alcun problema questa peculiarità delle classi in Python:
import attr
@attr.s
class Classe1(object):
x = attr.ib(kw_only=True)
Se non imposto l’argomento con il nome desiderato:
>>> Classe1()
Traceback (most recent call last):
...
TypeError: A() missing 1 required keyword-only argument: 'x'
Se però lo imposto correttamente:
>>> Classe1(x=1)
Classe1(x=1)
Python attrs: che cos’è e come funziona e come proseguire
Una cosa veramente bella che ritengo efficace e pratica dei creatori di questo pacchetto, è che hanno realizzato una sezione nominata “attrs by example” sulla documentazione ufficiale.
In parole meno tecnichesi, se clicchi su questo link, troverai una sezione della documentazione ufficiale di attrs dove vengono spiegate diverse peculiarità di attrs tramite esempi diretti e pratici.