In breve, la domanda: C'è un modo per impedire a Python di cercare variabili al di fuori dell'ambito corrente?Disabilitare la ricerca di variabili globali in Python
Dettagli:
Python guarda per le definizioni delle variabili in ambiti esterni se non sono definite nell'ambito corrente. Così, il codice come questo rischia di rompersi quando non facendo attenzione durante il refactoring:
def line(x, a, b):
return a + x * b
a, b = 1, 1
y1 = line(1, a, b)
y2 = line(1, 2, 3)
Se ho rinominato gli argomenti della funzione, ma ho dimenticato di rinominarle all'interno del corpo della funzione, il codice sarebbe ancora eseguito:
def line(x, a0, b0):
return a + x * b # not an error
a, b = 1, 1
y1 = line(1, a, b) # correct result by coincidence
y2 = line(1, 2, 3) # wrong result
Conosco gli ambiti esterni it is bad practice to shadow names from. Tuttavia, ci sono alcune ragioni per cui questo viene fatto in ogni caso:
- A volte può essere utile per avere gli stessi nomi perché si riferiscono alla stessa cosa
- Si potrebbe a corto di nomi di variabili significative
- pigrizia
C'è un modo per impedire a Python di cercare variabili al di fuori dell'ambito corrente? (So che l'accesso a
o b
genera un errore nel secondo esempio.)
A causa di essere pigro, preferirei una soluzione che funziona senza codice caldaia-piastra ripetuto :)
Se il problema è ambiguo in termini di versione Python, sono principalmente interessato a Python 3.3 e versioni successive.
No, non c'è. Altrimenti nessun built-in funzionerebbe mai. –
La soluzione migliore è usare * test appropriato *, piuttosto che cercare di violare Python. –
metti le ultime tre linee in un'altra funzione ... – LittleQ