Opzioni frozen e di confronto
Renda le dataclass immutabili e ordinate.
Opzioni frozen e di confronto è una lezione Python Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Python Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Python Academy include 4 lezioni in totale.
Opzioni del decoratore
Il decoratore @dataclass accetta argomenti denominati che controllano i metodi da generare. I più utili sono frozen e order.
frozen=Truerende immutabili le istanze.order=Trueaggiunge gli operatori di confronto.
Dataclass congelate
Con frozen=True, la classe generata impedisce l'assegnazione di attributi dopo la costruzione. Qualsiasi tentativo solleva FrozenInstanceError.
from dataclasses import dataclass, FrozenInstanceError
@dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(1, 2)
try:
p.x = 99
except FrozenInstanceError as e:
print('Cannot modify:', e)Perché l'immutabilità è utile
Gli oggetti immutabili sono più facili da comprendere: il loro valore non cambia dopo la creazione, quindi possono essere condivisi in sicurezza tra funzioni e thread. Sono inoltre sicuri da usare come chiavi di dizionario e membri di un set.
Frozen significa hashable
Una dataclass frozen è hashable per impostazione predefinita, quindi è possibile usare le sue istanze nei set o come chiavi di un dizionario. Le dataclass modificabili non sono hashable, a meno che non si scelga esplicitamente di abilitarlo.
from dataclasses import dataclass
@dataclass(frozen=True)
class Point:
x: int
y: int
seen = {Point(0, 0), Point(1, 1), Point(0, 0)}
print(len(seen))Sostituire valori frozen
Poiché non è possibile modificare un'istanza frozen, utilizzi dataclasses.replace() per creare una copia modificata. L'originale rimane invariato.
from dataclasses import dataclass, replace
@dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(1, 2)
q = replace(p, y=99)
print(p)
print(q)Dataclass ordinate
Per impostazione predefinita, una dataclass supporta solo ==. Aggiunga order=True per generare anche <, <=, > e >=.
from dataclasses import dataclass
@dataclass(order=True)
class Version:
major: int
minor: int
print(Version(1, 2) < Version(1, 5))
print(Version(2, 0) > Version(1, 9))Come funziona il confronto nell'ordinamento
L'ordinamento confronta i campi come una tupla, da sinistra a destra, nell'ordine in cui sono stati dichiarati. Il primo campo è quello più significativo.
from dataclasses import dataclass
@dataclass(order=True)
class Version:
major: int
minor: int
# major compared first, then minor
print(Version(1, 9) < Version(2, 0))Ordinare le istanze di una dataclass
Poiché le dataclass ordinate definiscono gli operatori di confronto, è possibile ordinare direttamente una lista di istanze con sorted().
from dataclasses import dataclass
@dataclass(order=True)
class Score:
points: int
name: str
data = [Score(50, 'B'), Score(90, 'A'), Score(70, 'C')]
for s in sorted(data):
print(s)Controllare la chiave di ordinamento
Per ordinare in base a un criterio diverso dall'ordine naturale dei campi, inserisca per primo un campo nascosto per l'ordinamento con field(init=False) e lo imposti in __post_init__. Gli altri campi possono essere esclusi dal confronto con compare=False.
from dataclasses import dataclass, field
@dataclass(order=True)
class Item:
sort_index: int = field(init=False, repr=False)
name: str = field(compare=False, default='')
priority: int = 0
def __post_init__(self):
self.sort_index = self.priority
print(Item(name='b', priority=2) > Item(name='a', priority=1))Combinare frozen e order
È possibile combinare le opzioni. Una dataclass frozen e ordinata costituisce un tipo valore immutabile e confrontabile ideale per chiavi, numeri di versione o coordinate.
from dataclasses import dataclass
@dataclass(frozen=True, order=True)
class SemVer:
major: int
minor: int
patch: int
versions = {SemVer(1, 0, 0): 'stable'}
print(SemVer(1, 0, 0) < SemVer(1, 1, 0))
print(versions[SemVer(1, 0, 0)])eq e il valore predefinito
L'opzione eq controlla se viene generato __eq__. Per impostazione predefinita vale True. Noti che order=True richiede eq=True, poiché l'ordinamento si basa sull'uguaglianza.
from dataclasses import dataclass
@dataclass(eq=True)
class Tag:
name: str
print(Tag('x') == Tag('x'))
print(Tag('x') == Tag('y'))Verifica rapida
Cosa accade assegnando un valore a un campo di un'istanza di dataclass frozen?
Riepilogo
Ha imparato a creare dataclass immutabili e ordinate.
frozen=Trueimpedisce le modifiche e rende le istanze hashable.- Utilizzi
replace()per creare copie modificate. order=Truegenera operatori di confronto che confrontano i campi come una tupla.- Combinare entrambe le opzioni permette di creare tipi valore affidabili.
Domande Frequenti
La lezione «Opzioni frozen e di confronto» è gratuita?
Sì — il testo completo di «Opzioni frozen e di confronto» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Python Academy, passa a CoddyKit PRO. Il corso Python Academy include 4 lezioni in totale.
Cosa imparerò in «Opzioni frozen e di confronto»?
Renda le dataclass immutabili e ordinate. Eserciti Python Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Python Academy?
Non è richiesta alcuna esperienza precedente. Python Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Opzioni frozen e di confronto»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Python Academy?
Sì. Ogni lezione Python Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Definire una dataclass
- Valori predefiniti e field()
- Opzioni frozen e di confronto
- La libreria attrs