Python फ़ॉर्मेटर
Python को उसी तरह रीफ़ॉर्मेट करें जैसे Black करता है - और देखें कि इसने ठीक कितनी पंक्तियाँ बदली हैं।
आपका कोड
0 वर्णफ़ॉर्मैट किया गया
Python को उसी तरह रीफ़ॉर्मेट करें जैसे Black करता है - और देखें कि इसने ठीक कितनी पंक्तियाँ बदली हैं।
यह उस पर Black चलाता है - वह फॉर्मेटर जिस पर ज़्यादातर Python प्रोजेक्ट पहले से सहमत हैं - जो आप पेस्ट करते हैं, आपकी चुनी हुई लाइन लंबाई और कोटेशन हैंडलिंग के साथ। अगर फ़ाइल पार्स नहीं होती, तो यह बताता है किस लाइन पर, और अगर यह पहले से ही फॉर्मेट है, तो यह भी बताता है, कुछ किया होने का दिखावा करने के बजाय।
Python को फॉर्मेट करने के लिए उसे चलाने की ज़रूरत नहीं होती। कोड को एक सिंटैक्स ट्री में पार्स किया जाता है और उस ट्री से फिर से लिखा जाता है, पूरी तरह मेमोरी में - यह कभी किसी फ़ाइल में नहीं लिखा जाता, कभी इम्पोर्ट नहीं किया जाता और कभी चलाया नहीं जाता। एक फॉर्मेटर जो आपके पेस्ट किए गए को चलाता, वह टेक्स्ट बॉक्स वाला एक रिमोट शेल होता।
Black एक AST-संरक्षित परिवर्तन है: बाहर आने वाला कोड वही प्रोग्राम है जो भीतर गया था। यह गुण ही पूरी वजह है कि एक फॉर्मेटर पर भरोसा किया जा सकता है, और यही वजह है कि इस टूल के किसी भी हिस्से में कोई भाषा मॉडल शामिल नहीं है। कोड को व्यवस्थित करने के लिए कहा गया मॉडल कभी-कभी काम करते समय एक लाइन फिर से लिख देगा, और काम कर रहे कोड में एक चुपचाप बदलाव वह एकमात्र विफलता है जो एक फॉर्मेटर वहन नहीं कर सकता।
वही सवाल जो CI पूछता है: क्या यह फ़ाइल बदलेगी? जाँच मोड आपका मूल कोड अछूता लौटाता है और बताता है कि क्या Black इसे फिर से फॉर्मेट करता, और कितनी लाइनों में। यह जानने का तेज़ तरीका है कि कोई पाइपलाइन उस फ़ाइल पर क्यों विफल हो रही है जिसे आप स्थानीय रूप से दोबारा नहीं बना सकते।
आख़िरी आइटम के बाद का कॉमा Black को बताता है कि कॉल या कलेक्शन को हर लाइन में एक आइटम के साथ रखे: result = compute(alpha, beta,) चार लाइनों में लौटता है, जिसमें alpha, और beta, अपनी-अपनी लाइन पर होते हैं। मैजिक ट्रेलिंग कॉमा को अनदेखा करें पर टिक करें, तो वही इनपुट लाइन की लंबाई में समाने पर result = compute(alpha, beta) बन जाता है। किसी हाथ से संरेखित ब्लॉक, जैसे मैट्रिक्स, को बचाने के लिए उसके ऊपर की लाइन में # fmt: off और नीचे # fmt: on लिखें; Black बीच का सब कुछ वैसा ही छोड़ देता है जैसा आपने लिखा। लाइन के अंत में # fmt: skip सिर्फ़ उसी लाइन को बचाता है। ये Black की अपनी टिप्पणियाँ हैं, इसलिए आपके प्रोजेक्ट का CI जब Black चलाता है तब भी काम करती हैं।
इसे सर्वर पर भेजा जाता है, मेमोरी में फॉर्मेट किया जाता है और उसी प्रतिक्रिया में लौटाया जाता है। कुछ भी डिस्क पर नहीं लिखा जाता, कैश नहीं होता या लॉग नहीं होता, और उपयोग रिकॉर्ड केवल गणनाएँ रखता है - आकार, विकल्प, कितनी लाइनें बदलीं - कभी कोड नहीं।
नहीं। Black लेआउट बदलता है, व्यवहार नहीं, लेकिन यह सिर्फ़ स्पेस खिसकाने से ज़्यादा करता है। यह फ़ालतू कोष्ठक हटाता है (x = (1) बनता है x = 1), संख्याओं के प्रीफ़िक्स और घातांक छोटे अक्षरों में करता है (0XABCDEF बनता है 0xABCDEF, 1E5 बनता है 1e5), किसी कॉल को कई लाइनों में तोड़ते समय अंत में कॉमा जोड़ता है, लगातार खाली लाइनों को घटाता है और docstring के अंदर के स्पेस काटता है (""" Doc. """ बनता है """Doc.""")। यह आख़िरी बदलाव __doc__ का टेक्स्ट बदल देता है, जो तभी मायने रखता है जब आपका कोड अपने ही docstring पढ़ता हो।
क्योंकि यह आपकी चुनी हुई लाइन लंबाई पर पहले से ही फॉर्मेट थी। टूल चुपचाप एक कॉपी लौटाने के बजाय "पहले से फॉर्मेट" कहता है।
नहीं। इम्पोर्ट्स को क्रमबद्ध करना isort का काम है, Black का नहीं, और दोनों इतनी बार असहमत होते हैं कि यहाँ करने पर यह आपको चौंका देता।
कोई भी फॉर्मेटर नहीं कर सकता - एक अपार्स करने योग्य फ़ाइल में फिर से लिखने के लिए कोई संरचना नहीं होती। आपको लाइन, कॉलम और आसपास का कोड मिलता है ताकि आप इसे ठीक कर सकें और फिर से कोशिश कर सकें।
Black एक जाने-माने अंतर के साथ PEP 8 के अनुकूल है: इसकी डिफ़ॉल्ट लाइन लंबाई 79 के बजाय 88 है। यदि आपको ज़्यादा सख़्त आंकड़ा चाहिए तो लाइन लंबाई चयनकर्ता में 79 चुनें।
एक बार में 400,000 अक्षरों तक। फ़ॉर्मेटिंग 10 सेकंड बाद रोक दी जाती है, जहाँ तक सिर्फ़ बहुत बड़ी या बहुत दोहराव वाली फ़ाइलें पहुँचती हैं, और हर IP पता 10 मिनट में 30 बार फ़ॉर्मेट कर सकता है।
यह पेज Black चलाता है, और चौड़ी स्क्रीन पर उसका वर्शन पेज के हेडर में दिखता है। Black प्रोजेक्ट की सेटिंग्स pyproject.toml के [tool.black] सेक्शन से, विकल्पों के लंबे नामों से पढ़ता है: आपके चुने "पंक्ति लंबाई" के लिए line-length = 88, "मेरे कोट्स बनाए रखें" चुना हो तो skip-string-normalization = true, "मैजिक ट्रेलिंग कॉमा को अनदेखा करें" के लिए skip-magic-trailing-comma = true और "लक्ष्य" में तय वर्शन के लिए target-version = ["py311"]। एडिटर प्लगइन और pre-commit हुक भी यही फ़ाइल पढ़ते हैं। फ़ॉर्मैट करने के लिए black . और CI में black --check --diff . चलाएँ: यह कुछ नहीं बदलता और अगर कोई फ़ाइल दोबारा फ़ॉर्मैट होती तो कोड 1 के साथ बाहर निकलता है। इस पेज वाला ही Black वर्शन पिन करें, क्योंकि हर कैलेंडर वर्ष की पहली रिलीज़ स्थिर स्टाइल बदल सकती है।
लगभग हमेशा, पर बाइट-दर-बाइट नहीं। Ruff का फ़ॉर्मैटर Black की सीधी जगह लेने के लिए बना है, और Ruff के दस्तावेज़ बताते हैं कि Django और Zulip जैसे Black से फ़ॉर्मैट किए गए बड़े प्रोजेक्ट पर 99.9% से ज़्यादा लाइनें एक जैसी निकलती हैं। जो कोड कभी Black से नहीं गुज़रा, उस पर, ख़ासकर लाइन के अंत की टिप्पणियों में, फ़र्क ज़्यादा होता है, और उसके दस्तावेज़ जानबूझकर किए गए अंतर गिनाते हैं। उसकी डिफ़ॉल्ट लाइन लंबाई भी 88 है, जो [tool.ruff] में line-length से तय होती है; [tool.ruff.format] में quote-style = "preserve" "मेरे कोट्स बनाए रखें" के बराबर है और skip-magic-trailing-comma = true "मैजिक ट्रेलिंग कॉमा को अनदेखा करें" के बराबर। अगर आपका CI ruff format --check चलाता है, तो फ़ाइल को इस पेज से नहीं, Ruff से जाँचें।