2009-10-28 14 views
5

Niektóre wyliczenia listy nie działają poprawnie, gdy osadzam IPython 0.10 zgodnie z instrukcjami. Co się dzieje z moją globalną przestrzenią nazw?Jak osadzić IPython w wyrażeniach generatora roboczego?

$ 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 

Odpowiedz

0

Wydaje się działać, ale IPython uważa, że ​​to główny program. Po utworzeniu IPShell, awaria pokazuje "whoops, IPython crashed".

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

listowe są w porządku, to działa:

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

wyrażeń To generatora (co właśnie zdałeś do tego list() rozmowy), które nie są w porządku:

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

Różnica : pozycje na liście są rozumiane w czasie definicji. Elementy w wyrażeniu generatora są określane, gdy wywoływane jest next() (na przykład przez iterację po przekazaniu go do list()), więc musi zachowywać odniesienie do zakresu, w którym jest zdefiniowane. Odniesienie do tego zakresu wydaje się być niewłaściwie obsługiwane; najprawdopodobniej jest to po prostu błąd IPythona.

Powiązane problemy