2009-10-28 7 views
5

जब मैं आईपीथन 0.10 को निर्देशों के अनुसार एम्बेड करता हूं तो कुछ सूची समझ ठीक से काम नहीं करती हैं। मेरे वैश्विक नामस्थान के साथ क्या चल रहा है?मैं काम कर रहे जनरेटर अभिव्यक्तियों के साथ आईपीथन कैसे एम्बेड करूं?

$ 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 

उत्तर

0

काम करने लगता है, लेकिन आईपीथन सोचता है कि यह मुख्य कार्यक्रम है। तो आईपीशेल को तुरंत चालू करने के बाद, एक क्रैश दिखाता है "व्हाउप्स, आईपीथन क्रैश हो गया"।

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

सूची comprehensions ठीक हैं, यह काम करता है:

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

यह जनरेटर भाव (जो क्या आपको लगता है कि list() कॉल को दिया गया) है कि नहीं ठीक कर रहे हैं:

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

अंतर : सूची समझ में वस्तुओं का मूल्यांकन समय पर मूल्यांकन किया जाता है। जनरेटर अभिव्यक्ति में आइटम का मूल्यांकन किया जाता है जब next() कहा जाता है (उदा। जब आप इसे list() पर पास करते हैं तो पुनरावृत्ति के माध्यम से), इसलिए इसे उस क्षेत्र के संदर्भ में अवश्य रखना चाहिए जहां इसे परिभाषित किया गया है। उस दायरे के संदर्भ को गलत तरीके से संभाला जा रहा है; शायद यह सिर्फ एक आईपीथन बग है।

संबंधित मुद्दे