2009-10-28 3 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 авария показывает, что «крики, IPython разбился».

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.

Смежные вопросы