2009-10-28 10 views
5

Talimatlara göre IPython 0.10'u yerleştirdiğimde, belirli liste anlaşmaları düzgün çalışmıyor. Küresel ad alanımda neler oluyor?IPython'u çalışma oluşturma ifadeleriyle nasıl yerleştirebilirim?

$ 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 

cevap

0

Çalıştığına inanılıyor, ancak IPython bunun ana program olduğunu düşünüyor. Yani IPShell'i başlattıktan sonra, bir kilitlenme "whoops, IPython çöktü" gösterir.

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

Liste comprehensions iyidir, bu çalışır:

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

It jeneratörü ifadelerini değildir ince olduğunu (bu list() çağrısına aktarılan budur):

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

fark : Liste kavramasındaki maddeler tanım zamanda değerlendirilir. Jeneratör ifadesindeki öğeler, next() çağrıldığında değerlendirilir (ör., list()'a ilettiğinizde yineleme yoluyla), böylece tanımlandığı kapsama bir başvuru tutmalıdır. Bu kapsam referansı yanlış ele alınmış gibi görünüyor; büyük ihtimalle bu sadece bir IPython hatası.

İlgili konular