2012-05-02 21 views
6

मेरे पास एक मॉड्यूल है जो कस्टम सजावट के साथ कुछ महत्वपूर्ण कार्यों को सजाने वाला है।सजावटी कार्यों में कदम उठाने का कोई तरीका है, सजावटी कोड छोड़ना

पीडीबी के साथ इन कार्यों को डीबग करना प्रायः दर्द का थोड़ा सा होता है, क्योंकि हर बार जब मैं सजाए गए फ़ंक्शन में जाता हूं तो मुझे पहले सजावटी कोड के माध्यम से कदम उठाना पड़ता है।

मैं बस उस फ़ंक्शन के भीतर ब्रेक करने के लिए डीबगर सेट कर सकता हूं, लेकिन महत्वपूर्ण कार्यों के रूप में उन्हें कई स्थानों से कई बार बुलाया जाता है, इसलिए मैं आमतौर पर फ़ंक्शन के बाहर डीबगिंग शुरू करना पसंद करता हूं।

मैं कोड के साथ वर्णन करने के लिए कोशिश की, लेकिन मैं नहीं जानता कि यह है कि अगर मदद करता है:

def i_dont_care_about_this(fn): 
    @functiontools.wraps(fn) 
    def wrapper(*args, **kwargs): 
     return fn(*args, **kwargs) 
    return wrapper 

@i_dont_care_about_this 
def i_only_care_about_this(): 
    # no use to set pdb here 

def i_am_here(): 
    import pdb; pdb.set_trace() 
    i_only_care_about_this() 

तो, वहाँ एक रास्ता मुझे i_dont_care_about_this माध्यम से जा रहा बिना i_am_here से i_only_care_about_this में कदम करने के लिए है?

अनिवार्य रूप से मैं जब किसी दिए गए सजाया समारोह में करने के लिए (रों) का चरण रों का उपयोग करके सभी डेकोरेटर कोड छोड़ना चाहते।

+2

कैसे PDB पता चला है कि एक समारोह से सजाया गया है माना जाता है और कम से जो मूल बिंदु entert है इंगित करता है घ? ऐसा कुछ करने के लिए आपको अपने सजावटी और पीडीबी दोनों को अनुकूलित करना होगा। –

+0

मैंने सोचा कि मेरे ज्ञान के रूप में एक तरीका हो सकता है कि कैसे पाइथन आंतरिक रूप से सजावटी हैंडल करता है कुछ हद तक सीमित है। –

उत्तर

4

मुझे नहीं लगता कि आप ऐसा कर सकते हैं। यह कुछ अलग होने के लिए कदम का अर्थ बदल देगा।

हालांकि, आप जो चाहते हैं उसके समान कुछ हासिल करने का एक तरीका है। अपने सजाए गए फ़ंक्शन में ब्रेकपॉइंट सेट करें और सजाए गए फ़ंक्शन को कॉल करने से ठीक पहले। अब, फ़ंक्शन के अंदर ब्रेकपॉइंट अक्षम करें।

अब, जब आप कोड चलाते हैं, तो यह केवल तभी टूट जाएगा जब आप उस विशिष्ट आमंत्रण तक पहुंच जाएंगे जिसकी आप परवाह है। एक बार ब्रेक होने के बाद, फ़ंक्शन में ब्रेकपॉइंट को पुनः सक्षम करें और निष्पादन जारी रखें। यह सभी सजाए गए कोड को निष्पादित करेगा और सजाए गए फ़ंक्शन की पहली पंक्ति को तोड़ देगा।

+0

एचएम, मुझे लगता है कि ओपी पहले से ही उस सामान को जानता है, कम से कम वह इस प्रश्न में इसे एक संभावित संभावना के रूप में वर्णित करता है जिसे उसने पहले ही माना है। –

+0

मैं वास्तव में नहीं है और यह कुछ मामलों में मदद कर सकता है –

6

डेकोरेटर प्रवेश या अन्य गैर कार्यात्मक व्यवहार के लिए विशुद्ध रूप से है, तो यह एक डिबगिंग के लिए कोई-op बनाने - सही i_dont_care_about_this की परिभाषा के बाद यह कोड डालना:

DEBUG = False 
# uncomment this line when pdb'ing 
# DEBUG = True 
if DEBUG: 
    i_dont_care_about_this = lambda fn : fn 

लेकिन अगर यह वास्तविक शामिल सक्रिय कोड है, तो आप डेकोरेटर के अंदर कोड के अंदर pdb.set_trace लिए इस तरह के एक conditionalized कॉल के रूप में pdb तरीकों का उपयोग कर काम करना होगा:

BREAK_FLAG = False 
... 
# (inside your function you want to debug) 
if BREAK_FLAG: 
    import pdb; pdb.set_trace() 
... 
# at your critical calling point 
BREAK_FLAG = True 
संबंधित मुद्दे