2009-10-28 9 views
5

Bestimmte Listenkomprehensionen funktionieren nicht richtig, wenn ich IPython 0.10 gemäß den Anweisungen einbettle. Was passiert mit meinem globalen Namespace?Wie verbinde ich IPython mit funktionierenden Generatorausdrücken?

$ 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 

Antwort

0

Scheint zu arbeiten, aber IPython denkt, dass es das Hauptprogramm ist. Nach der Instanziierung von IPShell zeigt ein Absturz "hoppla, IPython abgestürzt".

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

Liste Comprehensions fein sind, funktioniert dies:

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

Es ist Generator Ausdrücke (das ist, was Sie zu diesem list() Aufruf übergeben), die nicht in Ordnung sind:

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

Der Unterschied : Elemente im Listenverständnis werden zur Definitionszeit ausgewertet. Elemente im Generatorausdruck werden ausgewertet, wenn next() aufgerufen wird (z. B. durch Iteration, wenn Sie sie an list() übergeben), sodass sie einen Verweis auf den Bereich beibehalten muss, in dem sie definiert ist. Diese Bereichsreferenz scheint falsch behandelt zu werden. Wahrscheinlich ist das einfach ein IPython-Bug.