2009-10-28 8 views
5

Certaines définitions de liste ne fonctionnent pas correctement lorsque j'insère IPython 0.10 selon les instructions. Que se passe-t-il avec mon espace de noms global?Comment intégrer IPython avec des expressions génératrices de travail?

$ 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 

Répondre

0

Semble fonctionner, mais IPython pense que c'est le programme principal. Donc, après l'instanciation d'IPShell, un crash montre "whoops, IPython planté".

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

Liste compréhensions sont très bien, cela fonctionne:

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

C'est des expressions du générateur (qui est ce que vous avez passé à ce list() appel) qui ne sont pas bien:

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

La différence : les éléments de la liste de compréhension sont évalués au moment de la définition. Les éléments de l'expression de générateur sont évalués lorsque next() est appelé (par exemple par itération lorsque vous le transmettez à list()), de sorte qu'il doit conserver une référence à la portée où il est défini. Cette référence de portée semble être mal gérée; très probablement, c'est simplement un bug IPython.