2014-06-09 14 views
60

के लिए जेनरेटर ऑब्जेक्ट को सूची में कनवर्ट करें जब मैं आईपथन का उपयोग करके पाइथन में डिबगिंग कर रहा हूं, तो मैंने कभी-कभी ब्रेक-पॉइंट मारा और मैं एक वैरिएबल की जांच करना चाहता हूं जो वर्तमान में जनरेटर है। ऐसा करने का सबसे आसान तरीका मैं इसे एक सूची में परिवर्तित कर रहा हूं, लेकिन मुझे यह नहीं पता कि ipdb में एक पंक्ति में ऐसा करने का एक आसान तरीका क्या है, क्योंकि मैं पाइथन के लिए इतना नया हूं।डीबगिंग

उत्तर

102

जनरेटर पर बस list पर कॉल करें।

lst = list(gen) 
lst 

ध्यान रखें कि यह जेनरेटर को प्रभावित करता है जो किसी और आइटम को वापस नहीं करेगा।

आप आईपीथन में सीधे list पर भी कॉल नहीं कर सकते हैं, क्योंकि यह कोड की सूची रेखाओं के लिए एक आदेश के साथ संघर्ष करता है।

इस फाइल पर परीक्षण किया गया:

def gen(): 
    yield 1 
    yield 2 
    yield 3 
    yield 4 
    yield 5 
import ipdb 
ipdb.set_trace() 

g1 = gen() 

text = "aha" + "bebe" 

mylst = range(10, 20) 

जो जब रन:

$ python code.py 
> /home/javl/sandbox/so/debug/code.py(10)<module>() 
     9 
---> 10 g1 = gen() 
    11 

ipdb> n 
> /home/javl/sandbox/so/debug/code.py(12)<module>() 
    11 
---> 12 text = "aha" + "bebe" 
    13 

ipdb> lst = list(g1) 
ipdb> lst 
[1, 2, 3, 4, 5] 
ipdb> q 
Exiting Debugger. 

समारोह/चर/डिबगर नाम से बचने के लिए सामान्य विधि का विरोध करता

डिबगर आदेश p और pp रहे हैं कि print और prettyprint उनके बाद कोई अभिव्यक्ति होगी।

$ python code.py 
> /home/javl/sandbox/so/debug/code.py(10)<module>() 
     9 
---> 10 g1 = gen() 
    11 

ipdb> n 
> /home/javl/sandbox/so/debug/code.py(12)<module>() 
    11 
---> 12 text = "aha" + "bebe" 
    13 

ipdb> p list(g1) 
[1, 2, 3, 4, 5] 
ipdb> c 

भी एक exec आदेश, ! के साथ अपने अभिव्यक्ति है, जो डिबगर बलों अजगर एक के रूप में अपने अभिव्यक्ति लेने के लिए लगाकर से बुलाया नहीं है: इस प्रकार

तो आप इसे इस्तेमाल कर सकते हैं। जब डीबगर में

ipdb> !list(g1) 
[] 

अधिक जानकारी के लिए help p, help pp और help exec देखते हैं।

ipdb> help exec 
(!) statement 
Execute the (one-line) statement in the context of 
the current stack frame. 
The exclamation point can be omitted unless the first word 
of the statement resembles a debugger command. 
To assign to a global variable you must always prefix the 
command with a 'global' command, e.g.: 
(Pdb) global list_options; list_options = ['-l'] 
संबंधित मुद्दे