Video Corso Intermedio Python 3

02: L'Istruzione with

Menu della Serie



/div>

Ciao a tutti ragazzi e ragazze! In questa lezione parleremo dell'istruzione with. Si tratta di una delle tante migliorie apportate al linguaggio nel corso degli anni, proposta e spiegata nel dettaglio nella PEP 343 sul sito della Python Foundation, che potete quindi leggere nel dettaglio qui.
In questo tutorial ci occuperemo del perché è utile, e sopratutto di come usarla. Come abbiamo già detto in precedenza, quando lavoriamo con dei file, è sempre molto importante ricordarsi di chiuderli una volta usati, questo per evitare problemi sul file stesso e per sprechi di risorse preziose, come la memoria RAM. Supponiamo di avere un file testuale chiamato zazá, e di volerne leggere il contenuto, facciamo:

zenigata = open("zazà.txt","r")
for riga in zenigata:
    print(riga)
zenigata.close()

"Lupen
Was
Here!
:-D"
Ai fini della spiegazione, possiamo verificare se il file sia stato effettivamente chiuso in questo modo:
print(zenigata.closed)
True
Con l'istruzione with possiamo risparmiare una riga di codice ogni volta che apriamo un file, nello specifico la riga con l'istruzione close(), perché essa fa in modo che il file venga chiuso automaticamente quando si esce dal blocco del with. La usiamo in questo modo:
with open("zazà.txt","r") as zenigata:
    for riga in zenigata:
        print(riga)

print(zenigata.closed)

"Lupen
Was
Here!
:-D"

True
Ed ecco che otteniamo lo stesso risultato, ma in maniera più pulita e decisamente più sicura: lasciate allora che faccia un ulteriore accenno alla questione sicurezza. Usare i file puó comportare la comparsa di bug, e with ci permette di mitigare questa possibilità. Consideriamo il caso in cui stiamo lavorando con un file testuale contenente svariati numeri, che vogliamo aggiugnere ad una lista dopo averli convertiti in float:
numeri = []
dati = open("dati_importanti.txt","r")
for num in dati:
    numeri.append(float(num))
dati.close()
Per essere sicuri di poter chiudere il file qualunque cosa succeda, anche in caso di potenziali errori, dobbiamo utilizzare try, except e finally, in questa maniera:
numeri = []
dati = open("dati_importanti.txt","r")
try:
    for num in dati:
        numeri.append(float(num))
except ValueError:
    print("Errore!!!")
finally:
    dati.close()

print(dati.closed)

>>>Errore!!!
True
Ora si che il codice sta iniziando a farsi interessante. Ed è proprio per casi come questo, che with è stato implementato come miglioria, in quanto come abbiamo detto, il file viene chiuso automaticamente quando si esce dal blocco del with. Verifichiamolo usando comunque try ed except, ma senza il blocco finally in cui andiamo a chiudere il file:
numeri = []
with open("dati_importanti.txt","r") as dati:
    try:
        for num in dati:
            numeri.append(float(num))
    except ValueError:
        pass

print(dati.closed)

>>>True
Bene ragazzi e ragazze, questo era tutto per questa lezione! Ci vediamo nella prossima puntata!