El ejecutivo no recoge las variables del cierre.

Tengo un poco de curiosidad por qué el siguiente código genera un NameError .

 >>> s = """ ... foo = [1,2,3] ... def bar(): ... return foo[1] ... """ >>> namespace = {} >>> exec(s, {'__builtins__': None}, namespace) >>> print namespace {'foo': [1, 2, 3], 'bar': } >>> namespace['bar']() 

En el nivel normal de intérprete, podemos encontrar foo en bar.func_globals o bar.func_closure si está en una función. Supongo que me pregunto por qué el namespace['bar'] no pone a foo en func_closure

Resulta que la respuesta estuvo ahí todo el tiempo en los documentos :

Si se dan dos objetos separados como globales y locales, el código se ejecutará como si estuviera incrustado en una definición de clase.

Dado que estoy pasando tanto a nivel globals como a locals , se ejecuta como si fuera una clase.

 class Foo(object): foo = [1,2,3] @staticmethod def bar(): return foo[1] 

No es sorprendente que tampoco funcione :).

Para cualquier persona interesada en una solución alternativa, puede volver a namespace['bar'].func_globals namespace en el namespace['bar'].func_globals 1 ( inspirado en esto ):

 >>> namespace['bar'].func_globals.update(namespace) >>> namespace['bar']() 2 

Bonito.

1 Sería namespace['bar'].__globals__.update en python3.x