Python Academy · Lezione

Valori predefiniti e field()

Imposti valori predefiniti e utilizzi le opzioni di field().

Lezione 2 di 413 passaggi

Valori predefiniti e field() è una lezione Python Academy gratuita su CoddyKit. Questa è la lezione 2 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.

Assegnazione di valori predefiniti ai campi

Proprio come i parametri delle funzioni, i campi delle dataclass possono avere valori predefiniti. Un campo con un valore predefinito può essere omesso quando si crea un'istanza.

from dataclasses import dataclass

@dataclass
class Server:
    host: str
    port: int = 8080

print(Server('localhost'))
print(Server('example.com', 443))

L'ordine è importante

I campi con valori predefiniti devono venire dopo quelli senza valori predefiniti, esattamente come gli argomenti delle funzioni. In caso contrario, Python solleva un TypeError quando la classe viene definita.

from dataclasses import dataclass

@dataclass
class User:
    name: str       # required
    active: bool = True   # optional

print(User('Alice'))

La trappola dei valori predefiniti mutabili

Non può usare direttamente come valore predefinito un oggetto mutabile, come una lista o un dizionario. Tutte le istanze condividerebbero lo stesso oggetto. Python lo rileva e solleva un ValueError per proteggerLa.

from dataclasses import dataclass
from typing import List

# This raises ValueError at class definition time:
try:
    @dataclass
    class Bad:
        items: List[int] = []
except ValueError as e:
    print('Error:', e)

field(default_factory=...)

Per assegnare un valore predefinito mutabile, utilizzi field(default_factory=...). La factory viene chiamata per ogni nuova istanza, quindi ogni istanza riceve un oggetto nuovo e indipendente.

from dataclasses import dataclass, field
from typing import List

@dataclass
class Cart:
    items: List[str] = field(default_factory=list)

a = Cart()
a.items.append('apple')
b = Cart()
print(a.items, b.items)

default e default_factory

Utilizzi field(default=...) per i valori immutabili quando deve anche specificare altre opzioni di field(). Utilizzi default_factory per tutto ciò che è mutabile. Non può passare entrambi contemporaneamente.

from dataclasses import dataclass, field

@dataclass
class Config:
    retries: int = field(default=3)
    tags: list = field(default_factory=list)

print(Config())

Esclusione di un campo da repr

L'opzione repr=False nasconde un campo dal __repr__ generato. È utile per i segreti o per grandi buffer interni.

from dataclasses import dataclass, field

@dataclass
class Account:
    user: str
    token: str = field(repr=False, default='secret')

print(Account('alice'))

Esclusione di un campo dal confronto

Con compare=False, un campo viene ignorato dal __eq__ generato (e dall'ordinamento). Due istanze possono essere uguali anche se quel campo è diverso.

from dataclasses import dataclass, field

@dataclass
class Event:
    name: str
    timestamp: float = field(compare=False, default=0.0)

print(Event('login', 1.0) == Event('login', 99.0))

Campi init=False

Impostare init=False esclude un campo da __init__. Di solito lo si combina con un valore predefinito oppure lo si imposta in __post_init__.

from dataclasses import dataclass, field

@dataclass
class Circle:
    radius: float
    area: float = field(init=False, default=0.0)

c = Circle(2.0)
print(c)

__post_init__ per i valori derivati

Definisca __post_init__ per eseguire del codice subito dopo il __init__ generato. È il punto naturale in cui calcolare i campi derivati da altri campi.

from dataclasses import dataclass, field

@dataclass
class Circle:
    radius: float
    area: float = field(init=False, default=0.0)

    def __post_init__(self):
        self.area = 3.14159 * self.radius ** 2

print(Circle(2.0))

Memorizzazione dei metadati

L'argomento metadata associa una mappatura arbitraria a un campo. Python la ignora, ma gli strumenti e il Suo codice possono leggerla per ottenere indicazioni sulla documentazione o sulla validazione.

from dataclasses import dataclass, field, fields

@dataclass
class Product:
    price: float = field(metadata={'unit': 'USD'})

for f in fields(Product):
    print(f.name, f.metadata)

Combinazione delle opzioni di field()

Le opzioni sono combinabili. Un singolo campo può essere nascosto dal repr, escluso dai confronti e avere contemporaneamente un valore predefinito.

from dataclasses import dataclass, field

@dataclass
class Session:
    user: str
    token: str = field(default='x', repr=False, compare=False)

print(Session('alice'))
print(Session('alice') == Session('alice', token='different'))

Verifica rapida

Come si assegna a un campo di una dataclass una lista vuota come valore predefinito?

Riepilogo

Ha imparato a impostare valori predefiniti e a utilizzare le opzioni di field().

  • I campi con valori predefiniti vengono dopo quelli obbligatori.
  • Utilizzi default_factory per i valori predefiniti mutabili.
  • repr, compare, init e metadata permettono di configurare ogni campo.
  • __post_init__ calcola i valori derivati.
Gratis per iniziare

Impara Python con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
76
Lezioni
320

Domande Frequenti

La lezione «Valori predefiniti e field()» è gratuita?

Sì — il testo completo di «Valori predefiniti e field()» è 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 «Valori predefiniti e field()»?

Imposti valori predefiniti e utilizzi le opzioni di field(). 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 2 di 4.

Quanto tempo richiede la lezione «Valori predefiniti e field()»?

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