Question

Certaines compréhensions de liste ne fonctionnent pas correctement lorsque j'intègre IPython 0.10 conformément aux instructions. Que se passe-t-il avec mon espace de noms global?

$ 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
Était-ce utile?

La solution 2

semble fonctionner, mais IPython pense que c'est le programme principal. Ainsi, après l’instanciation d’IPShell, un blocage indique "whoops, IPython s'est écrasé".

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

Autres conseils

La compréhension de la liste est correcte, cela fonctionne:

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

Ce sont des expressions de générateur (qui sont ce que vous avez passé à cet appel de list () ) qui ne vont pas bien:

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

La différence: les éléments de la compréhension de la liste sont évalués au moment de la définition. Les éléments de l'expression du 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 à la portée semble être mal gérée; très probablement, c'est simplement un bogue IPython.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top