2009-10-28 8 views
5

Ciertas listas por comprensión no funcionan correctamente cuando lo integrar IPython 0,10 según las instrucciones. ¿Qué está pasando con mi espacio de nombres global?¿Cómo incrusto IPython con expresiones generadoras activas?

$ python 
>>> import IPython.Shell 
>>> IPython.Shell.IPShellEmbed()() 
In [1]: def bar(): pass 
    ...: 
In [2]: list(bar() for i in range(10)) 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 

/tmp/<ipython console> 

/tmp/<ipython console> in <generator expression>([outmost-iterable]) 

NameError: global name 'bar' is not defined 

Respuesta

0

Parece que funciona, pero IPython cree que es el programa principal. Entonces, después de crear una instancia de IPShell, un bloqueo muestra "whoops, IPython se colgó".

import IPython.Shell 
ipshell = IPython.Shell.IPShell(argv=[], user_ns={'root':root}) 
ipshell.mainloop() 
1

Las listas por comprensión están bien, esto funciona:

[bar() for i in range(10)] 

expresiones generadoras de ella (que es lo que ha pasado a la list() llamada) que no están bien:

gexpr = (bar() for i in range(10)) 
list(gexpr) 

La diferencia : los elementos en la lista de comprensión se evalúan en el momento de la definición. Los elementos de la expresión generador se evalúan cuando next() se llama (por ejemplo a través de iteración cuando se pasa a list()), por lo que debe mantener una referencia al ámbito de aplicación donde se define. Esa referencia de alcance parece manejarse incorrectamente; lo más probable es que sea simplemente un error de IPython.

Cuestiones relacionadas