動作中のジェネレーター式にIPythonを埋め込むにはどうすればよいですか?
質問
指示に従ってIPython 0.10を埋め込むと、特定のリストの内包表記が正しく機能しません。グローバル名前空間で何が起こっているのですか?
$ 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
解決 2
機能しているように見えますが、IPythonはそれがメインプログラムであると考えています。そのため、IPShellをインスタンス化した後、クラッシュで「おっと、IPythonがクラッシュしました」と表示されます。
import IPython.Shell
ipshell = IPython.Shell.IPShell(argv=[], user_ns={'root':root})
ipshell.mainloop()
他のヒント
リストの理解は問題ありません。これは動作します:
[bar() for i in range(10)]
それは、ジェネレータ式(これは list()
呼び出しに渡したもの)で、うまくありません:
gexpr = (bar() for i in range(10))
list(gexpr)
違い:リスト内包の項目は定義時に評価されます。ジェネレータ式の項目は、 next()
が呼び出されたときに評価されます(たとえば、 list()
に渡すときの反復処理を通じて)。したがって、スコープへの参照を保持する必要があります。定義されている場所。そのスコープ参照は誤って処理されているようです。ほとんどの場合、それは単にIPythonのバグです。
所属していません StackOverflow