पायथन कोड को PEP8 अनुरूप बनाने के लिए उपकरण


113

मुझे पता है कि ऐसे उपकरण हैं जो यह सत्यापित करते हैं कि क्या आपका Python कोड PEP8 के अनुरूप है, उदाहरण के लिए एक ऑनलाइन सेवा और एक अजगर मॉड्यूल दोनों है

हालांकि, मैं एक सेवा या मॉड्यूल जो कर सकते हैं नहीं मिल सकता है परिवर्तित एक आत्म निहित, PEP8 वैध अजगर फाइल करने के लिए मेरी अजगर फ़ाइल। क्या कोई जानता है कि कोई भी हो?
मुझे लगता है कि यह PEP8 के बाद से कोड की उपस्थिति के बारे में संभव है, सही है?


1
मुझे नहीं लगता कि कोई भी उपकरण है जो कोड को PEP8 संगत कोड में परिवर्तित करता है। PEP8 में चर नामकरण नियम भी शामिल हैं, इसलिए, यदि ऐसा उपकरण मौजूद है, तो यह आपके चर नामों को भी नाम देगा और आप तब अपना कोड नहीं समझ पाएंगे।
अश्विनी चौधरी

1
@ अश्विनीचौधरी यह एक अच्छा बिंदु है, यह भी ध्यान देने योग्य बात है कि बदलते चर नाम आपके कोड का उपयोग करने वाले पहले से ही दूसरों को प्रभावित कर सकते हैं, क्योंकि यह हमेशा एक अच्छा विचार नहीं है। (autopep8 यह नहीं करता है।)
एंडी हेडन

जवाबों:


38

दुर्भाग्य से "pep8 स्टॉर्मिंग" (पूरी परियोजना) के कई नकारात्मक दुष्प्रभाव हैं:

  • बहुत सारे मर्ज-संघर्ष
  • तोड़ दोष
  • कोड की समीक्षा करना मुश्किल है

एक विकल्प के रूप में ( विचार के लिए @ जिप के लिए धन्यवाद ), मैंने एक छोटा पैकेज लिखा है जो केवल उन पंक्तियों को ऑटोपेप करता है जो आप पिछले कमिट / ब्रांच के बाद से काम कर रहे हैं:

मूल रूप से इस परियोजना को छोड़ने से थोड़ा बेहतर है कि आपने इसे पाया :

pip install pep8radius

मान लीजिए कि आपने अपना काम बंद कर दिया है masterऔर प्रतिबद्ध होने के लिए तैयार हैं:

# be somewhere in your project directory
# see the diff with pep, see the changes you've made since master
pep8radius master --diff
# make those changes
pep8radius master --diff --in-place

या आखिरी प्रतिबद्ध के बाद से आपके द्वारा शुरू की गई नई लाइनों को साफ करने के लिए:

pep8radius --diff
pep8radius --diff --in-place

# the lines which changed since a specific commit `git diff 98f51f`
pep8radius 98f51f --diff

मूल रूप pep8radiusसे git / hg diff ( पिछले साझा प्रतिबद्ध से ) के उत्पादन में लाइनों के लिए ऑटोपेप 8 को लागू कर रहा है ।

यह स्क्रिप्ट वर्तमान में git और hg के साथ काम करती है, अगर आपका कुछ और उपयोग कर रहा है और यह काम करना चाहता है तो कृपया एक टिप्पणी / मुद्दा / PR पोस्ट करें !


2
+1 बहुत अच्छी पहल ... मैं एक ही उद्देश्य के लिए एक नोटपैड ++ प्लगइन बनाने के बारे में सोच रहा हूं ... जैसे कि विंडोज पर मेरा पसंदीदा संपादक है
kmonsoor

1
@kmonsoor अच्छा विचार है, मैंने संपादक प्लगइन्स के बारे में नहीं सोचा था! मुझे जीथब पर किसी भी तरह से बताएं कि मैं सीएलआई के बाहर उपयोग करने में आसान / आसान बना सकता हूं ... मैं कुछ (रिज़ॉल्वेबल) मुद्दों को भूल जाता हूं।
एंडी हेडन

यहाँ मुझे संपादक प्लगइन्स की एक दिलचस्प सूची मिली github.com/jcrocholl/pep8/wiki/RelatedTools , हालांकि नोटपैड ++ के लिए कोई भाग्य नहीं ...
kmonsoor

1
मैंने सिर्फ Notepad ++ और Autopep8 के बीच पुल करने के लिए एक स्क्रिप्ट बनाई, एक और प्लगइन "पायथन स्क्रिप्ट" पर आधारित। हालाँकि, यह काम करता है। Plz यहाँ देखें: bit.ly/pep8_tonizer
kmonsoor

184

आप autopep8 का उपयोग कर सकते हैं ! जब भी आप खुद को एक कप कॉफी बनाते हैं तो यह उपकरण खुशी से उन सभी pesky PEP8 उल्लंघन को हटा देता है जो कोड का अर्थ नहीं बदलते हैं ।

इसे पाइप के माध्यम से स्थापित करें:

pip install autopep8

इसे एक विशिष्ट फ़ाइल पर लागू करें:

autopep8 py_file --in-place

या आपकी परियोजना के लिए (पुनरावर्ती), क्रिया विकल्प आपको कुछ प्रतिक्रिया देता है कि यह कैसे हो रहा है :

autopep8 project_dir --recursive --in-place --pep8-passes 2000 --verbose

नोट: कभी-कभी 100 पास का डिफ़ॉल्ट पर्याप्त नहीं होता है, मैंने इसे 2000 तक सेट कर दिया है क्योंकि यह यथोचित रूप से उच्च है और सभी परेशान करने वाली फाइलों को पकड़ लेगा (यह एक बार फिर से गुजरता है क्योंकि यह बिना हल के pep8 infractions पाता है) ...

इस बिंदु पर मेरा सुझाव है कि रिटायर होना और कमिट करना!

यदि आप "पूर्ण" PEP8 अनुपालन चाहते हैं: मैंने जिस एक युक्ति का उपयोग किया है वह ऊपर के रूप में autopep8 को चलाने के लिए है, तो PEP8 को चलाएं, जो शेष उल्लंघनों (फ़ाइल, लाइन संख्या और क्या) को प्रिंट करता है:

pep8 project_dir --ignore=E501

और मैन्युअल रूप से इन व्यक्तिगत रूप से बदल (जैसे E712s - बूलियन के साथ तुलना)।

नोट: autopep8 एक --aggressiveतर्क प्रदान करता है (इन अर्थ-बदलते उल्लंघनों को बेरहमी से "ठीक" करने के लिए), लेकिन सावधान रहें यदि आप आक्रामक का उपयोग करते हैं तो आपको डीबग करना पड़ सकता है ... (जैसे सुन्न / पांडा में True == np.bool_(True)लेकिन नहीं True is np.bool_(True)!)

आप देख सकते हैं कि प्रत्येक प्रकार के कितने उल्लंघन (पहले और बाद में):

pep8 --quiet --statistics .

नोट: मुझे लगता है कि E501s (लाइन बहुत लंबा) एक विशेष मामला है क्योंकि आपके कोड में इनमें से बहुत सारे होंगे और कभी-कभी ये ऑटोपेप 8 द्वारा सही नहीं किए जाते हैं।

एक उदाहरण के रूप में, मैंने इस तकनीक को पांडा कोड बेस पर लागू किया


@hayden क्या आपके पास इस पर कोई टिप्पणी है कि यह कितना विश्वसनीय है, और इसे पेश करने वाले अजीब मुद्दों के लिए स्वचालित सुधार का अनुपात है?
मारीस

@ मार्स मैं इसका इस्तेमाल पांडा कोड (जो बहुत बड़ा है) पर करता था और इसने कोई अजीब मुद्दे नहीं दिखाए, यह कोड को नहीं बदलेगा जिसका अर्थ बदल जाता है , मैंने इनका उल्लेख करने के लिए अपना जवाब अपडेट कर दिया है। इससे पहले Sphinx के हैशबैंग (PEP8 में एक बग अब तय) के साथ एक मुद्दा था।
एंडी हेडन

2
क्या यह टिप्पणियों के भीतर स्ट्रंक और व्हाइट लागू करता है?
एरिक

1
25 अक्टूबर, 2017 तक, pep8इस उत्तर में उल्लिखित पैकेज का नाम बदल दिया गया है pycodestyle: github.com/PyCQA/pycodestyle/releases/tag/1.7.1
hb20007

8

@ एंडी हेडन ने ऑटोपेप 8 का अच्छा अवलोकन किया। इसके अलावा एक और पैकेज है जिसे pep8ify कहा जाता है जो समान कार्य भी करता है।

हालाँकि दोनों पैकेज केवल लिंट त्रुटियों को दूर कर सकते हैं लेकिन वे कोड को प्रारूपित नहीं कर सकते हैं।

little = more[3:   5]

Pep8ifying के बाद भी उपरोक्त कोड समान रहता है। लेकिन कोड अभी तक अच्छा नहीं लगता है। आप yapf जैसे फ़ॉर्मेटर्स का उपयोग कर सकते हैं , जो कोड को PEP8 के अनुरूप होने पर भी कोड स्वरूपित करेगा। ऊपर कोड स्वरूपित किया जाएगा

little = more[3:5]

कुछ बार यह आपके मैनुअल फॉर्मेटिंग को भी नष्ट कर देता है। उदाहरण के लिए

BAZ = {
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
}

में परिवर्तित हो जाएगा

BAZ = {[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]}

लेकिन आप इसे कुछ हिस्सों को अनदेखा करने के लिए कह सकते हैं।

BAZ = {
   [1, 2, 3, 4],
   [5, 6, 7, 8],
   [9, 10, 11, 12]
}  # yapf: disable

मेरे पुराने ब्लॉग पोस्ट से लिया गया: स्वचालित रूप से PEP8 और अपने पायथन कोड को प्रारूपित करें!


2
है little = more[3: 5]pep8 (पुस्तकालय) में एक बग? yapf निश्चित रूप से यहां भविष्य है, इसके पीछे एल्गोरिदम (अनिवार्य रूप से सभी स्वरूपण विकल्पों के ग्राफ में सबसे छोटा पथ) एक बहुत ही सुंदर समाधान है, और इसमें संभवतः कम कीड़े के साथ-साथ विहित स्वरूपण भी होगा।
एंडी हेडन

@AndyHayden ऐसा लगता है कि यह एक लापता विशेषता है, यह E225 को ठीक नहीं करता है
ChillarAnand

5

यदि आप ग्रहण + PyDev का उपयोग कर रहे हैं, तो आप बस PyDev की सेटिंग से autopep8 को सक्रिय कर सकते हैं: Windows -> प्राथमिकताएँ -> खोज फ़िल्टर में 'autopep8' टाइप करें।

कोड फॉर्मेटिंग के लिए 'यूज ऑटोपेप8 थ्रीडी' की जांच करें। -> ठीक है

अब ग्रहण के CTRL-SHIFT-F कोड स्वरूपण को आपके कोड को autopep8 का उपयोग करके प्रारूपित करना चाहिए :)

स्क्रीन शॉट


3

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

क्योंकि पुन: स्वरूपण अधिक सटीक होना चाहिए - अगर यह कुछ ऐसा करता है जिसे आप नहीं चाहते कि यह बेकार हो जाए - वे पीईपी के कम हिस्से को कवर करते हैं, तो लिंटर अधिक दिखाते हैं।

उन सभी के पास कॉन्फ़िगर करने के लिए अलग-अलग अनुमतियाँ हैं - उदाहरण के लिए, इसके सभी नियमों में pylinter कॉन्फ़िगर करने योग्य (आप हर प्रकार की चेतावनियों को चालू / बंद कर सकते हैं), बिल्कुल भी अपरिवर्तनीय नहीं।

यहां कुछ उपयोगी लिंक और ट्यूटोरियल दिए गए हैं:

प्रलेखन:

लिंटर (लोकप्रियता के क्रम में):

  • प्रकार की जाँच के लिए mypy https://github.com/python/mypy लिंटर (PEP-484)
  • pycodestyle https://github.com/PyCQA/pycodestyle - PEP-8 का उपयोग करके बहुत अच्छी, बहुत लोकप्रिय। अक्सर पाइलिंट और फ्लेक 8 के साथ प्रयोग किया जाता है (साथ में)
  • pylint https://github.com/PyCQA/pylint बहुत विन्यास योग्य, सक्रिय रूप से समर्थित
  • दस्यु https://github.com/PyCQA/bandit линтер по безопасности
  • पूर्वेक्षक https://github.com/PyCQA/prospector pylint + कोड कठिनाई की जांच
  • flake8 https://github.com/PyCQA/flake8 प्लगइन्स चालू करने की क्षमता के साथ pycodestyle आवरण। विभिन्न विन्यास योग्य प्लगइन्स की बहुत बड़ी सूची। यहाँ भयानक flake8 रेपो है: https://github.com/DmytroLitvinov/awesome-flake8-extensions
  • wemake https://github.com/wemake-services/wemake-python-styleguide - एक परियोजना में बहुत सारे अलग-अलग लिंटर को संयोजित करने की कोशिश कर रहा है (वास्तव में यह एक फ्लैके 8 प्लगइन है जो कई अन्य लेज़रों से शैलियों का संयोजन करता है)
  • pylama https://github.com/klen/pylama एक (mypy, pylint, pycodeestyle, pydocstyle и др।) में 10 अन्य लिंटर को संयोजित करने की कोशिश कर रहा है। मैं यहां केवल एक ही समस्या देख सकता हूं - पुराना संस्करण (लगभग 10 महीनों के लिए जीथब रेपो में कोई अपडेट नहीं।)
  • pydocstyle https://github.com/PyCQA/pydocstyle docstrings linter (PEP-257)

कोड स्वरूपकर्ता (लोकप्रियता के क्रम में):

  • ब्लैक https://github.com/psf/black सबसे अधिक आबादी वाली कंपनियों में उपयोग किए जाने वाले सबसे अधिक आबादी वाले फ़ॉर्मूला। यापफ से बाद में बनाया गया था, लेकिन पहले से ही GitHub पर अधिक शुरू होता है
  • yapf https://github.com/google/yapf Google कोड फ़ॉर्मेटर
  • autopep8 https://github.com/hhatto/autopep8 pycodestyle पर निर्माण करें

1

वहां कई हैं।

आईडीई में आमतौर पर कुछ स्वरूपण क्षमता होती है। इन्टेलिज आइडिया / पाइकार्म करता है, वही ग्रहण के लिए पायथन प्लगइन के लिए जाता है, और इसी तरह।

ऐसे फॉर्मेट / लिंटर हैं जो कई भाषाओं को लक्षित कर सकते हैं। https://coala.io उन लोगों का एक अच्छा उदाहरण है।

फिर एकल उद्देश्य उपकरण हैं, जिनमें से कई अन्य उत्तरों में उल्लिखित हैं।

स्वचालित सुधार की एक विशिष्ट विधि फ़ाइल को एएसटी ट्री (टिप्पणी छोड़ने के बिना) में पार्स करना है और फिर इसे पाठ में डंप करना है (जिसका अर्थ है कि मूल स्वरूपण का कुछ भी संरक्षित नहीं है)। इसका उदाहरण https://github.com/python/black होगा ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.