動作中のジェネレーター式にIPythonを埋め込むにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1639474

  •  08-07-2019
  •  | 
  •  

質問

指示に従って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のバグです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top