0Pricing
Python Academy · Lezione

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=True rende immutabili le istanze.
  • order=True aggiunge 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=True impedisce le modifiche e rende le istanze hashable.
  • Utilizzi replace() per creare copie modificate.
  • order=True genera 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

  1. Definire una dataclass
  2. Valori predefiniti e field()
  3. Opzioni frozen e di confronto
  4. La libreria attrs
← Torna a Python Academy