Как мне встроить IPython с рабочими выражениями генератора? - PullRequest
5 голосов
/ 28 октября 2009

Определенные списки не работают должным образом, когда я встраиваю 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 ]

1 голос
/ 29 октября 2009

Понимание списка в порядке, это работает:

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

Это выражения генератора (то, что вы передали этому вызову list()), которые не подходят:

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

Разница: элементы в списке понимания оцениваются во время определения. Элементы в выражении генератора оцениваются, когда вызывается next() (например, посредством итерации, когда вы передаете его в list()), поэтому оно должно сохранять ссылку на область, в которой оно определено. Эта ссылка на область видимо неправильно обрабатывается; скорее всего, это просто ошибка IPython.

0 голосов
/ 28 октября 2009

Кажется, работает, но IPython считает, что это основная программа. Таким образом, после создания экземпляра IPShell сбой показывает «упс, сбой IPython».

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