2009-10-28 5 views
5

指示に従ってIPython 0.10を埋め込むと、特定のリスト内包が正しく機能しません。私のグローバル名前空間はどうなっていますか?IPythonをジェネレーター式で埋め込むにはどうすればよいですか?

$ 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 

答えて

0

IPythonはそれがメインプログラムだと思っています。だから、IPShellをインスタンス化した後、クラッシュは "whoops、IPython crashed"と表示されます。

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

リストの内包表記は、罰金です、この作品:

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

それは罰金ではありません(あなたがそのlist()呼び出しに渡されたものです)ジェネレータ式だ:

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

違い:リスト理解の項目は、定義時に評価されます。ジェネレータ式の項目は、next()が呼び出されたときに評価されます(たとえば、list()に渡すと繰り返し処理される)ので、定義されているスコープへの参照を保持する必要があります。そのスコープ参照は誤って処理されているようです。おそらくそれは単純にIPythonのバグです。

関連する問題