
La funzione locals() in Python
Nel linguaggio Python la funzione locals() restituisce i valori delle variabili locali in una funzione.
locals()
Questa funzione va inserita all'interno della funzione e ti permette di vedere i valori correnti delle variabili locali dove viene chiamata.
E' quindi molto utile per fare le operazioni di debug e per l'introspezione dinamica, ossia l'ispezione delle variabili locali in un determinato blocco di codice durante l'esecuzione.
La funzione locals() restituisce le informazioni del namespace della funzione sotto forma di un dizionario, in cui le chiavi sono le etichette delle variabili e i valori il loro contenuto.
Un esempio di utilizzo nelle funzioni
Per capire meglio come funziona locals() ti faccio un esempio pratico.
Scrivi questo script ed eseguilo.
def esempio():
a = 1
b = 2
c = 3
print(locals())
esempio()
Lo script definisce una funzione "esempio()" che assegna tre valori alle variabili locali (a=1, b=2, c=3).
Dentro il blocco di codice della funzione è inserita anche locals() che stampa il namespace locale della funzione.
In questo caso il namespace è composto dalle variabili:
{'a': 1, 'b': 2, 'c': 3}
Da notare che le informazioni sulle variabili locali e i valori corrispondenti sono restituite in un dizionario.
Quindi, per leggere ogni singolo valore devi iterare l'oggetto o accedere alle singole chiavi dell'oggetto iterabile.
Puoi utilizzare locals() anche al di fuori delle funzioni, ad esempio a livello di modulo, ma in quel contesto è spesso più utile utilizzare globals(), che ritorna un dizionario rappresentante la tabella dei simboli globale.
Un aspetto interessante di `locals()` è che potresti essere tentato di usarlo per modificare le variabili locali dinamicamente.
Tuttavia, bisogna fare attenzione: modificare il dizionario restituito da locals() non cambia sempre le variabili locali nel modo che potresti aspettarti. Quindi generalmente non è consigliata.
def prova_locals():
x = 10
print("Prima:", locals())
locals()['x'] = 20
print("Dopo:", locals())
print("Valore effettivo di x:", x)
prova_locals()
Potresti notare che, anche se il dizionario locali mostrato da `locals()` cambia, il valore "reale" della variabile `x` potrebbe non cambiare.
Questo esempio serve a mostrare i limiti di manipolazione delle variabili locali attraverso locals().
Quando usare locals()?
La funzione `locals()` è particolarmente utile per il debugging o la registrazione, quando vuoi vedere rapidamente lo stato delle variabili locali in un certo punto del tuo programma.
E' invece sconsigliato usarla per modificare o accedere in modo dinamico alle variabili, ci sono spesso metodi più diretti e sicuri.
In sintesi, locals() ti offre una potente finestra sulle variabili locali di Python, ma come ogni strumento potente, va usato con cautela e comprensione dei suoi limiti.
La funzione locals negli oggetti
Puoi utilizzare la funzione locals() anche all'interno dei metodi di un oggetto in Python, ma con una specifica considerazione: all'interno di un metodo, locals() ritorna il dizionario delle variabili locali del metodo, non dell'intero oggetto.
In altre parole, le variabili d'istanza dell'oggetto non sono considerate variabili locali nel contesto di un metodo e quindi non saranno incluse nel dizionario restituito da locals()
Ad esempio, definisci una classe
class MiaClasse:
def __init__(self):
self.variabile_istanza = "Questo è un attributo d'istanza"
def altro_metodo(self):
altra_variabile_locale = "Questa è un'altra variabile locale"
def mio_metodo(self):
variabile_locale = "Questo è una variabile locale"
print(locals())
Poi crea l'istanza
oggetto = MiaClasse()
Infine, chiama il metodo che contiene la funzione locals()
oggetto.mio_metodo()
La chiamata a locals() si verifica dentro il metodo "mio_metodo()".
Quindi, la funzione restituisce solo la variabile "variabile_locale".
{'self': <__main__.MiaClasse object at 0x7f00470ec2e0>, 'variabile_locale': 'Questo è una variabile locale'}
Questo output mostra due cose:
- 'self': Questa è una chiave nel dizionario che fa riferimento all'oggetto istanza stesso su cui è stato chiamato il metodo. L'indirizzo 0x7f00470ec2e0 è un indirizzo di memoria che indica dove l'oggetto è allocato nella memoria del computer.
- 'variabile_locale': Questa chiave nel dizionario rappresenta una variabile locale definita all'interno del metodo. Il valore associato, 'Questo è una variabile locale', è il valore assegnato a quella variabile all'interno del metodo.
Come puoi notare, locals() non restituisce la variabile "altra_variabile_locale" perché si trova dentro un altro metodo, né "variabile_istanza" perché è un attributo dell'oggetto e non è una variabile locale del metodo "mio_metodo".
Come accedere agli attributi di istanza?
Se vuoi accedere agli attributi di un'istanza o variabili d'istanza all'interno di un metodo, puoi farlo direttamente tramite il prefisso "self".
Ad esempio, scrivendo "self.variabile_istanza".
class MiaClasse:
def __init__(self):
self.variabile_istanza = "Questo è un attributo d'istanza"
def mostra_attributo(self):
# Accesso all'attributo d'istanza
print(self.variabile_istanza)
oggetto = MiaClasse()
oggetto.mostra_attributo()
Questo è un attributo d'istanza
In conclusione, la funzione locals() è utile per ottenere le variabili locali in un metodo, mentre per gli attributi dell'oggetto dovresti utilizzare "self".