Frage

Bestimmte Listenverständnisse funktionieren nicht ordnungsgemäß, wenn ich Ipython 0.10 gemäß den Anweisungen einbettet. Was ist mit meinem globalen Namespace los?

$ 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
War es hilfreich?

Lösung 2

Scheint zu funktionieren, aber Ipython glaubt, dass es das Hauptprogramm ist. Nach dem Instanziieren von Ipshell zeigt ein Absturz "Whoops, Ipython ist abgestürzt".

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

Andere Tipps

Listenverständnisse sind in Ordnung, dies funktioniert:

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

Es sind Generatorausdrücke (genau das sind Sie daran bestanden list() Rufen Sie an) das ist nicht in Ordnung:

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

Der Unterschied: Elemente im Listenverständnis werden zum Zeitpunkt der Definition bewertet. Elemente im Generatorausdruck werden bewertet, wenn next() wird genannt (zB durch Iteration, wenn Sie es an weitergeben list()), so dass es einen Hinweis auf den Bereich behalten muss, in dem es definiert ist. Diese Rahmenreferenz scheint falsch behandelt zu werden; Höchstwahrscheinlich ist das einfach ein Ipython -Fehler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top