2012-08-31 18 views
7

मान लीजिए कि मेरे पास एक पायथन प्रोग्राम है जहां यह परिभाषित करने के लिए जोर दिया गया है कि चीजें कैसे होनी चाहिए, और मैं AssertionError को फेंकने के बजाय रीड-इवल-लूप के साथ विसंगतियों को कैप्चर करना चाहता हूं।क्या मैं AssertionError पर डिबगिंग पायथन को मजबूर कर सकता हूं?

दी, मैं

if (reality!=expectation): 
    print("assertion failed"); 
    import pdb; pdb.set_trace(); 

हो सकता था, लेकिन वह कहीं अधिक एक सादे assert(reality==expectation) से कोड में बदसूरत है।

मैं pdb.set_trace() को except: ब्लॉक में शीर्ष-स्तर पर कॉल कर सकता था, लेकिन फिर मैं विफलता के सभी संदर्भ खो गया होता, है ना? (मेरा मतलब है, अपवाद ऑब्जेक्ट से स्टैकट्रैक पुनर्प्राप्त किया जा सकता है, लेकिन तर्क मान आदि नहीं)

क्या --magic कमांड-लाइन ध्वज की तरह कुछ भी है जो मुझे आवश्यकतानुसार पायथन 3 दुभाषिया को बदल सकता है?

+0

ग्रहण का उपयोग करें और इसे ब्रेकपॉइंट के साथ डीबग मोड में चलाएं? –

+0

@ जोरन बेस्ले: आपके पास हमेशा एक आईडीई नहीं है। उदाहरण: जब आप एक एसएसएच खोल पर लॉग ऑन होते हैं। – Constantinius

+1

फिर कमांड लाइन से पीडीबी का उपयोग करें और ब्रेकपॉइंट्स का उपयोग करें ... http://www.doughellmann.com/PyMOTW/pdb/ 'python -m pdb somescript.py' आपका '- मैजिक' –

उत्तर

4

nose प्रोजेक्ट पर एक नज़र डालें। आप त्रुटियों पर डीबगर में ड्रॉप करने के लिए --pdb option के साथ इसका उपयोग कर सकते हैं।

+0

मुझे लगता है कि यूनिट परीक्षण करने वालों के लिए यह आसान है, लेकिन यह नहीं है कि मैं यहां क्या कर रहा हूं। – PypeBros

11

मुख्य रूप से this great snippet से लिया:

import sys 

def info(type, value, tb): 
    if hasattr(sys, 'ps1') or not sys.stderr.isatty() or type != AssertionError: 
     # we are in interactive mode or we don't have a tty-like 
     # device, so we call the default hook 
     sys.__excepthook__(type, value, tb) 
    else: 
     import traceback, pdb 
     # we are NOT in interactive mode, print the exception... 
     traceback.print_exception(type, value, tb) 
     print 
     # ...then start the debugger in post-mortem mode. 
     pdb.pm() 

sys.excepthook = info 

जब आप इस के साथ अपने कोड को प्रारंभ, सभी AssertionError रों pdb आह्वान करना चाहिए।

+0

इसे आजमाएं ... – PypeBros

+0

मुझे लगता है कि "पोस्ट-मॉर्टम मोड" अनिवार्य है, और कोई मौका नहीं है 'pdb.set_trace()' कोई उपयोगी होगा, है ना? – PypeBros

+0

मुझे वास्तव में यहां यकीन नहीं है, मुझे लगता है कि आपको कोशिश करनी है। – Constantinius