2025, Sep 27 01:31

E225 बनाम E226: Flake8/pycodestyle में ऑपरेटर स्पेसिंग क्यों अलग दिखती है

Flake8 और pycodestyle में E225 व E226 का अंतर समझें: ऑपरेटर के आसपास whitespace नियम, कौन से केस फ़्लैग होते हैं, और सही कॉन्फ़िग से लिंटिंग को एकसमान बनाएं.

अंकगणितीय ऑपरेटरों के आसपास कहीं‑कहीं स्पेस गायब होने पर Flake8 चेतावनी क्यों देता है, लेकिन कुछ मामलों को छोड़ देता है? अगर आपने कभी किसी पंक्ति पर E226 देखा है और उतनी ही संदिग्ध दूसरी पंक्ति पर नहीं, तो आप परदे के पीछे स्टाइल‑चेक के बँटवारे की एक सूक्ष्म वजह से टकरा रहे हैं।

अंतर का छोटा उदाहरण

नीचे दिया गया स्निपेट तीन दिखने में समान एक्सप्रेशनों को दिखाता है, पर E225 को नज़रअंदाज़ करने पर Flake8 केवल एक को E226 के रूप में फ़्लैग करता है:

x = 0*0  # E226 के रूप में फ़्लैग किया गया
x = 0* 0  # E225 को अनदेखा करने पर E226 के रूप में फ़्लैग नहीं होता
x = 0 *0  # E225 को अनदेखा करने पर E226 के रूप में फ़्लैग नहीं होता

आम तौर पर उद्धृत गाइडेंस के अनुसार, अपेक्षित व्यवहार सीधा सा लगता है:

अंकगणितीय ऑपरेटर (+, -, /, और *) के पहले और बाद में एक‑एक स्पेस होना चाहिए।

असली में हो क्या रहा है

यह व्यवहार Flake8 से नहीं, बल्कि pycodestyle से आता है। Flake8 एक रैपर की तरह काम करता है और स्टाइल‑चेक्स pycodestyle को सौंप देता है। pycodestyle.py के भीतर E226 “arithmetic operator के आसपास whitespace नहीं” नियम को ऐसे ब्रांचिंग के साथ लागू किया गया है जो आंतरिक स्थिति को ट्रैक करती है (उदाहरण के लिए need_space जैसी वेरिएबल के ज़रिए)। यही ब्रांचिंग तय करती है कि अलग‑अलग स्पेसिंग स्थितियों में E226 उठेगा या E225।

संक्षेप में, E226 उस स्थिति को पकड़ता है जब ऑपरेटर के दोनों ओर कोई स्पेस नहीं होता—यही पहली पंक्ति है। बाकी दो पंक्तियाँ E225 के दायरे में आती हैं, जो अन्य परिस्थितियों में ऑपरेटर के आसपास गायब whitespace को कवर करता है। अगर E225 आपकी ignore सूची में है, तो सिर्फ पहली पंक्ति E226 के रूप में रिपोर्ट होगी और बाकी दो छूट जाएँगी।

संदर्भ: pycodestyle का इम्प्लीमेंटेशन (pycodestyle Github) और E225/E226 नियमों का विवरण (E225 Rule, E226 Rule)।

लिंटर के व्यवहार को एकसमान कैसे करें

अगर आप चाहते हैं कि तीनों पंक्तियाँ फ़्लैग हों, तो E225 को अनदेखा न करें। E225 सक्षम होगा तो वह आंशिक स्पेसिंग वाले केस कवर करेगा, और E226 पूरी तरह बिना स्पेस वाले ऑपरेटर को कवर करता रहेगा। व्यवहार में इसका मतलब है कि E225 और E226 दोनों सक्षम रखें ताकि सभी स्पेसिंग उल्लंघन दिखें।

सुधारा हुआ कोड

गाइडेंस का पालन करने के लिए ऑपरेटर के दोनों ओर एक‑एक स्पेस रखें:

y = 0 * 0

एक और बारीकी है: E226 संदर्भ पर निर्भर करता है। pep8 precedence को उभारने के लिए whitespace का उपयोग सुझाता है; उदाहरण के लिए y = m*x + c को y = m * x + c पर प्राथमिकता दी जाती है। इसी से स्पष्ट होता है कि E226 और E225 अलग‑अलग जाँचें क्यों हैं और उनका व्यवहार थोड़ा अलग क्यों है।

आपके टूलिंग के लिए यह क्यों मायने रखता है

यह समझना कि Flake8 जाँचें pycodestyle को सौंपता है, स्पष्ट करता है कि केवल Flake8 की सेटिंग बदलने से कभी‑कभी असंगत नतीजे क्यों दिखते हैं। E225 और E226 की बाँटी हुई जिम्मेदारियाँ जानने से आप अपनी ignore सूची और CI गेट्स को बिना अप्रत्याशितताओं के कॉन्फ़िगर कर पाते हैं, और कोड रिव्यू भी किसी कथित लिंटर गड़बड़ी पर अटकता नहीं।

निष्कर्ष

अगर केवल पूरी तरह बिना स्पेस वाला ऑपरेटर ही फ़्लैग हो रहा है, तो वजह यह है कि E226 उसी सटीक स्थिति को कवर करता है, जबकि आंशिक स्पेसिंग की समस्याएँ E225 में आती हैं। व्यापक whitespace जाँच के लिए E225 और E226 दोनों सक्षम रखें, जहाँ उपयुक्त हो वहाँ ऑपरेटर के दोनों ओर स्पेस दें, और याद रखें कि precedence दिखाने के लिए संदर्भ‑आधारित स्पेसिंग चुनने की गुंजाइश E226 छोड़ सकता है।

यह लेख StackOverflow पर प्रश्न (लेखक: ginjaemocoes) और David Silveiro के उत्तर पर आधारित है।