Say, tengo cierto margen con variables, y una función llamada en este ámbito quiere cambiar algunas variables inmutables:Acceso al ámbito exterior en Python 2.6
def outer(): s = 'qwerty' n = 123 modify() def modify(): s = 'abcd' n = 456
¿Es posible de alguna manera para acceder al ámbito exterior? Algo así como nonlocal
variables de Py3k.
Claro que puedo hacer s,n = modify(s,n)
en este caso, pero ¿qué sucede si necesito una 'inyección' genérica que se ejecute allí y deba poder reasignar a variables arbitrarias?
que tienen en cuenta el rendimiento, por lo que, si es posible, eval
& pila de inspección marco no es bienvenido :)
UPD: Es imposible. Período. Sin embargo, hay algunas opciones sobre cómo acceder a las variables en el ámbito externo:
- Usar globales. Por cierto,
func.__globals__
es un diccionario mutable;) - variables de la tienda en un dict/clase-instancia/cualquier otro recipiente mutable
- Dale las variables como argumentos & recuperarlos como una tupla:
a,b,c = innerfunc(a,b,c)
- Inyectar otra función de bytecode. Esto es posible con
byteplay
módulo python.
Eso no es cómo funciona el alcance. Solicitas acceder a un alcance en un marco de pila diferente. Sería ** muy ** confuso si el alcance permitiera lo que intentas aquí, piensa en la repetición de cola siendo reescrita en bucles. Entonces, la optimización del código de repente cambiaría el significado de un programa, esto nunca sucederá. – Tino