Quiero declarar una función de forma dinámica y quiero ajustar cualquier acceso a las variables globales O alternativamente definir qué variables son libres y ajustar el acceso a las variables libres.Python: cómo configurar dinámicamente el entorno de cierre de función
estoy jugando un poco con código como el siguiente:
class D:
def __init__(self):
self.d = {}
def __getitem__(self, k):
print "D get", k
return self.d[k]
def __setitem__(self, k, v):
print "D set", k, v
self.d[k] = v
def __getattr__(self, k):
print "D attr", k
raise AttributeError
globalsDict = D()
src = "def foo(): print x"
compiled = compile(src, "<foo>", "exec")
exec compiled in {}, globalsDict
f = globalsDict["foo"]
print(f)
f()
Esto produce la salida:
D set foo <function foo at 0x10f47b758>
D get foo
<function foo at 0x10f47b758>
Traceback (most recent call last):
File "test_eval.py", line 40, in <module>
f()
File "<foo>", line 1, in foo
NameError: global name 'x' is not defined
Lo que quiero es de alguna manera coger el acceso a x
con mi envoltorio dict-como D
. ¿Cómo puedo hacer eso?
No quiero predefinir todas las variables globales (en este caso x
) porque quiero poder cargarlas perezosamente.
¿Funciona si x ya está en globalsDict? – phkahler
@phkahler No, no es así. 'f' todavía usa el dict real. La forma de evitar esto no es ajustar 'f', sino ajustar' x' en un proxy de objeto. – agf