Wie bin ich Ipython in funktionierende Generatorausdrücke ein?
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
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.