पिचर्म में, मैं ब्रेकपॉइंट पर तोड़ना चाहता हूं जो डिबगिंग के दौरान कुछ भी नहीं करता है। मैं यह कैसे कर सकता हूँ?

उदाहरण के लिए, मैं pass कथन को तोड़ना चाहूंगा:

for i in range(999999):
    if i == 6232:
        pass

अगर मैं pass पर ब्रेकपॉइंट सेट करता हूं, तो डीबगर वहां नहीं टूटता है। अब तक मैं जो सबसे करीब कर पाया हूं, वह है कुछ अप्रयुक्त चर नाम बनाना, और इसे एक व्यर्थ मान देना, इसलिए मैं उस पंक्ति पर एक विराम बिंदु सेट कर सकता हूं:

for i in range(999999):
    if i == 6232:
        foobar_unused_variable = "At least I can set a breakpoint on this line."
13
Edward Ned Harvey 4 पद 2017, 05:05
1
मैंने इसमें भी भाग लिया है - आम तौर पर मैं किसी प्रकार का नोप स्टेटमेंट डालता हूं (जैसे i, जो वैध पायथन है लेकिन कुछ भी नहीं करता है)। इसमें पाइलिंट द्वारा उठाए जाने का अतिरिक्त लाभ है, इसलिए मैं इसे गलती से नहीं करता।
 – 
Shadow
4 पद 2017, 05:07
2
pass का अर्थ है कुछ भी न करें, और संकलन करते समय कुछ भी न करने का निर्णय लिया जाता है, इसलिए pass पर कोई निष्पादन योग्य कोड नहीं होता है, और अंत में डीबगर nothing को डीबग नहीं कर सकता है।
 – 
Sraw
4 पद 2017, 05:11
1
यह गलत लगता है क्योंकि यह वही है जो 'एनओपी' है इसलिए डीबगर "कुछ भी नहीं" डीबग कर सकता है क्या मैं गलत हूं?
 – 
Laz Nikolaj Andersen
17 अप्रैल 2018, 13:23
AFAIK, तुम गलत हो। सबसे पहले, एक डिबगर केवल वही डिबग कर सकता है जो वास्तव में निष्पादित हो रहा है, यह एक गैर-मौजूद जगह पर नहीं टूट सकता है। दूसरा, छवि यदि आप उस कंपाइलर के लेखक हैं, तो आप निश्चित रूप से जितना संभव हो सके अनावश्यक कोड को अनुकूलित और कम करने के लिए अपना सर्वश्रेष्ठ प्रयास करेंगे। इस मामले में, क्या आप लक्ष्य कोड में बिल्कुल बेकार कोड जोड़ देंगे? निश्चित रूप से आप इसे निष्पादित करने के लिए कितना भी समय क्यों न लें, यह एक बर्बादी है।
 – 
Sraw
17 अप्रैल 2018, 13:32
उदाहरण के लिए, यह सशर्त ब्रेकपॉइंट if <condition here>: pass के लिए उपयोगी है यदि आप पास में ब्रेक जोड़ते हैं, तो वाक्य तभी निष्पादित किया जाएगा जब शर्त सही हो।
 – 
Xwtek
22 जून 2020, 08:31

4 जवाब

इलिप्सिस का प्रयोग करें!

त्वरित ब्रेकप्वाइंट या कुछ ऐसा जो आपके कोड पर न्यूनतम दृश्य प्रभाव डालता है, आप एक ... (एलिप्सिस) डाल और तोड़ सकते हैं:

उदाहरण के लिए:

while some_condition():
    do_something()
    ...  #  <<< set break point here!

यह मेरे प्रति सबसे साफ रास्ता हो सकता है।

कुछ पृष्ठभूमि

एलिप्सिस मुख्य रूप से स्लाइस नोटिंग के लिए एक विशेष बिल्ट-इन पायथन ऑब्जेक्ट है। यहाँ मैं (ab) इसका उपयोग कुछ और करने के लिए करता हूँ। देखें: पायथन एलिप्सिस ऑब्जेक्ट क्या करता है?

किसी निश्चित स्थान पर विराम बिंदु सेट करने के लिए कोड में एक पूर्ण पूर्णांक, चर नाम या कुछ डालने के लिए ठीक है, लेकिन यह अजीब लग सकता है और आपके कोड को अव्यवस्थित कर सकता है, लेकिन ... दृष्टिहीन है। इसके साथ तुलना करें:

break_point = 0
while some_condition():
    do_something()
    break_point # <<< set break point here!

या यह:

while some_condition():
    do_something()
    if False: # <<< set break point here!
        pass

कुछ अन्य तरकीबों का परीक्षण किया गया:

del []  # works(with warning: "cannot assign to []")
[]  # works(with warning: Statement seems to have no effect)
setbreakpoint = 1  # works(with warning: "local variable value is not used")
Ellipsis  # works(with warning: Statement seems to have no effect)

एक और दिलचस्प बात जो मेरे साथ होती है, वह है, जब मैं pass पर ब्रेकप्वाइंट सेट करता हूं तो यह कोड में इसके स्थान के आधार पर टूट सकता है या नहीं भी हो सकता है, लेकिन ब्रेक के लिए सटीक नियम है या नहीं यह किसी तरह स्पष्ट नहीं है।

7
imkzh 31 अक्टूबर 2018, 06:19
3
अच्छा प्रयास, लेकिन... जब मैं बस एक ... या एक 3 को कोड में चिपका देता हूं और उस पर एक ब्रेकपॉइंट सेट करता हूं ... यह टूटता नहीं है। मुझे लगता है कि कुछ कंपाइल ऑप्टिमाइज़र इसे दूर कर रहे हैं ... भले ही मैं if False: डाल दूं और उस पर ब्रेक लगाने की कोशिश करूं, यह टूटता नहीं है। संकलक का सुझाव देने के लिए और सबूत इसे दूर अनुकूलित करते हैं। \_(ツ)_/¯
 – 
Edward Ned Harvey
31 अक्टूबर 2018, 02:09
हाय @ एडवर्ड, मैंने इसे PyCharm समुदाय 2017.3 में cpython प्लगइन (बिना ipython) के साथ करने की कोशिश की है, और यह नंगे चर, ... और if False: पर टूट जाएगा, लेकिन pass पर नहीं टूटेगा। या 3, आप किस आईडीई का उपयोग कर रहे हैं?
 – 
imkzh
31 अक्टूबर 2018, 05:35
दिलचस्प... मैं PyCharm Pro 2018.2.4 का उपयोग कर रहा हूं। आपने cpython कहा लेकिन क्या आपका मतलब cython था? तुलना मैट्रिक्स कहता है कि cython को सपोर्ट करने के लिए आपको प्रो की जरूरत है।
 – 
Edward Ned Harvey
31 अक्टूबर 2018, 20:12
आह हाँ इसका साइथन। (एक ताजा PyCharm इंस्टॉल पर, यह अक्सर उपयोगकर्ता को डिबगिंग को तेज करने के लिए साइथन एक्सटेंशन स्थापित करने के लिए प्रेरित करेगा, और मैंने इसे शांत करने के लिए इंस्टॉल लिंक का पालन किया, जैसा कि jetbrains.com/help/pycharm/cython-speedups.html : "शुक्र है, पायथन साइथन के माध्यम से संकलित सी-एक्सटेंशन का समर्थन करता है। PyCharm जहाजों डीबगर कोड के सी संस्करणों के साथ, जिसे आप PyCharm में तेजी से डिबगिंग करने के लिए संकलित कर सकते हैं।") @ एडवर्ड
 – 
imkzh
31 अक्टूबर 2018, 20:30
PyCharm कम्युनिटी 2020 में बढ़िया काम करना। बहुत बहुत धन्यवाद!
 – 
Christopher Galpin
4 सितंबर 2020, 18:33

जब जस्ट-इन-टाइम कंपाइलर आपके उदाहरण को संकलित करता है, तो यह pass को कुछ भी नहीं के रूप में संकलित करता है। दूसरे शब्दों में, pass केवल एक कीवर्ड है जिसका उपयोग कंपाइलर को यह बताने के लिए किया जाना चाहिए कि अन्यथा खाली ब्लॉक में कोई सिंटैक्स त्रुटि नहीं है। उदाहरण के लिए, pass के बिना कोड चलाने का प्रयास करें। काम नहीं करेगा। आप pass के स्थान पर एक अप्रयुक्त अभिव्यक्ति (जैसे 0) या प्रभाव-रहित कथन (जैसे print(end='')) डालने का भी प्रयास कर सकते हैं। लेकिन जब संभव हो तो मैं इन्हें हटाने की सलाह दूंगा। आप {a href="https://docs.python.org/3/library/pdb.html#pdbcommand-break" rel="noreferrer">सशर्त विराम बिंदु को के भीतर तोड़ने के बजाय सेट कर सकते हैं if स्टेटमेंट।

अपडेट करें: Python 3.7+ के रूप में, अब कोई भी अंतर्निहित breakpoint() फ़ंक्शन

9
Tyler Crompton 6 अगस्त 2019, 22:55

जैसा कि अन्य ने कहा है, ऐसा करने का कोई साफ तरीका नहीं है। मैं अनुशंसा करता हूं कि पास के बजाय, एक बेकार कथन दर्ज करें जैसे

dbg = True

फिर उस लाइन पर ब्रेक पॉइंट सेट करें।

लाभ:

  1. यह आपको वहां एक ब्रेकपॉइंट सेट करने की अनुमति देता है। (आप क्या करना चाहते थे।)
  2. एक बार जब आप मुहावरे के अभ्यस्त हो जाते हैं, तो आप जानते हैं कि इसका वास्तव में क्या अर्थ है।
  3. समय-समय पर आप अपने कोड की जांच कर सकते हैं और उन पुराने को हटा सकते हैं जिनका आप अब उपयोग नहीं करते हैं।

नुकसान:

  1. यदि आप उन्हें समय-समय पर नहीं हटाते हैं तो यह आपके कोड को अव्यवस्थित कर देता है।
  2. सहयोगी भ्रमित हो सकते हैं कि आप क्या कर रहे हैं।
  3. यदि आप उन्हें उत्पादन कोड में छोड़ देते हैं तो थोड़ा सा प्रदर्शन हिट हो सकता है (इस पर निर्भर करता है कि पाइथन उन्हें अनुकूलित करता है या नहीं)।
3
philologon 8 अगस्त 2018, 22:21

ब्रेकपॉइंट फ़ंक्शन

breakpoint() इनके लिए अच्छा है:

  • पायथन> = 3.7
  • एक अंतर्निहित कोड सफाई अनुस्मारक।
  • हमेशा सक्रिय; इसे माउस क्लिक से टॉगल ऑफ नहीं किया जा सकता है।

एक डमी प्रिंट स्टेटमेंट

लेकिन जब मैं इसे चालू और बंद करना चाहता हूं तो मैं इसे () के माध्यम से कॉल किए बिना प्रिंट फ़ंक्शन का उपयोग करता हूं; इस तरह:

for i in range(999999):
    print                 # Toggle breakpoint on this line

डमी वैरिएबल असाइनमेंट

यह एक डमी वैरिएबल असाइन करने से बेहतर है क्योंकि यह मेरे नेमस्पेस को अव्यवस्थित नहीं करता है (जो इसे डीबग करना आसान बनाता है), और PyCharm मुझे अप्रयुक्त चर के बारे में चेतावनी नहीं देता है।

अनेक बिंदु

मेरे PyCharm पर इलिप्स समाधान मेरे लिए काम नहीं करता था।

0
ChaimG 21 जुलाई 2021, 20:46