Di ', ho un certo margine con le variabili, e una funzione chiamata in questo ambito vuole cambiare alcune variabili immutabili:Accesso al campo di applicazione esterna in Python 2.6
def outer(): s = 'qwerty' n = 123 modify() def modify(): s = 'abcd' n = 456
è possibile in qualche modo per accedere al campo di applicazione esterna? Qualcosa come le variabili nonlocal
da Py3k.
Certo che posso fare s,n = modify(s,n)
in questo caso, ma cosa succede se ho bisogno di un 'iniezione' generico che esegue lì e deve essere in grado di riassegnare a variabili arbitrarie?
devo prestazioni in mente, quindi, se possibile, l'ispezione eval
cornice & dello stack non è il benvenuto :)
UPD: E 'impossibile. Periodo. Tuttavia, ci sono alcune opzioni su come accedere alle variabili nell'ambito esterno:
- Utilizzare le globali. Tra l'altro,
func.__globals__
è un dizionario mutabile;) - variabili Conservare in dict/class-instance/qualsiasi altro contenitore mutevole
- Dare variabili come argomenti & farli tornare come una tupla:
a,b,c = innerfunc(a,b,c)
- Inject altra funzione di bytecode. Questo è possibile con il modulo python
byteplay
.
Non è così che funziona lo scoping. Chiedi di accedere a un ambito su un diverso stackframe. Sarebbe ** molto ** confuso se l'ambito consentisse ciò che provate qui, pensate alla ricorsione della coda riscritta nei loop. Quindi l'ottimizzazione del codice cambierebbe improvvisamente il significato di un programma, questo non accadrà mai. – Tino