5

指示に従ってIPython0.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
4

2 に答える 2

1

リスト内包表記は問題ありません。これは機能します。

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

うまくいかないのはジェネレータ式(これはあなたがそのlist()呼び出しに渡したものです)です:

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

違い:リスト内包表記の項目は、定義時に評価されます。ジェネレータ式の項目は、next()が呼び出されたときに評価されるため(たとえば、に渡すときの反復によってlist())、定義されているスコープへの参照を保持する必要があります。そのスコープ参照は正しく処理されていないようです。ほとんどの場合、これは単にIPythonのバグです。

于 2009-10-29T14:19:13.777 に答える
0

動作しているように見えますが、IPythonはそれがメインプログラムであると考えています。したがって、IPShellをインスタンス化した後、クラッシュは「おっと、IPythonがクラッシュした」ことを示します。

import IPython.Shell
ipshell = IPython.Shell.IPShell(argv=[], user_ns={'root':root})
ipshell.mainloop()
于 2009-10-28T19:57:51.100 に答える