PEP 8, कीवर्ड तर्क या डिफ़ॉल्ट पैरामीटर मान में '=' ​​के आसपास कोई स्थान क्यों नहीं है?


103

PEP 8 =कीवर्ड तर्क या डिफ़ॉल्ट पैरामीटर मान में रिक्त स्थान नहीं होने की अनुशंसा क्यों करता है ?

क्या =पायथन कोड की हर दूसरी घटना के आसपास रिक्त स्थान की सिफारिश करने के साथ यह असंगत है ?

कैसे:

func(1, 2, very_long_variable_name=another_very_long_variable_name)

से बेहतर:

func(1, 2, very_long_variable_name = another_very_long_variable_name)

पायथन के BDFL द्वारा चर्चा / स्पष्टीकरण के किसी भी लिंक की सराहना की जाएगी।

मन, यह प्रश्न डिफ़ॉल्ट मानों की तुलना में kwargs के बारे में अधिक है, मैंने अभी PEP 8 से वाक्यांश का उपयोग किया है।

मैं राय का आग्रह नहीं कर रहा हूँ। मैं इस फैसले के पीछे कारण पूछ रहा हूं। यह पूछने की तरह अधिक है कि मैं सी प्रोग्राम में स्टेटमेंट {के समान लाइन का उपयोग क्यों करूंगा if, यह नहीं कि मुझे इसका उपयोग करना चाहिए या नहीं।

जवाबों:


72

मुझे लगता है कि ऐसा इसलिए है क्योंकि एक कीवर्ड तर्क अनिवार्य रूप से एक चर असाइनमेंट से अलग है।

उदाहरण के लिए, इस तरह के बहुत सारे कोड हैं:

kw1 = some_value
kw2 = some_value
kw3 = some_value
some_func(
    1,
    2,
    kw1=kw1,
    kw2=kw2,
    kw3=kw3)

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

इसके अलावा, पैरामीटर एक ही लाइन में चलते हैं, जबकि असाइनमेंट आमतौर पर अपनी लाइन में हर एक होते हैं, इसलिए अंतरिक्ष को बचाने के लिए एक महत्वपूर्ण जगह होने की संभावना है।


6
यह मामला हो सकता है, लेकिन अभी भी इस तरह के एक अच्छी तरह से डिजाइन की गई भाषा के लिए कोड शैली सिफारिशों में इस IMO आइकैंसिस्टिबिलिटी को पेश करना अजीब लगता है, केवल 2 वर्णों को बचाने के लिए। यह ऐसा है जैसे कि जावा कोड शैली ने कहा कि यह {एक नई पंक्ति में डालने के ifलिए एक ही है (वर्णों की समान संख्या को बचाता है) लेकिन वर्ग परिभाषा में नहीं। साथ ही एक कीवर्ड पैरामीटर डिफ़ॉल्ट मान से अलग है लेकिन फिर भी उसी शैली की अनुशंसा का उपयोग करता है।
१६

3
जैसा कि मैंने कहा, वे अलग चीजें हैं। उन्हें अलग तरह से लिखना समझ में आता है।
फोरट्रान

6
मैं कहूँगा कि यह वास्तव में अधिक पठनीय नहीं है kw1 = kw1, kw2 = kw2;) लेकिन शायद यही बात गुइडो और बैरी ने सोची थी।
१६

1
मैं इस awer को स्वीकार करता हूँ क्योंकि यह बहुत आश्वस्त है। एक लिंक को इसकी पुष्टि करने में कोई
दिक्कत

5
तथ्य यह है कि खोजशब्द तर्क, चर असाइनमेंट की तुलना में मूलभूत रूप से भिन्न है, विभिन्न सम्मेलनों IMO के लिए एक वैध तर्क नहीं है, क्योंकि अंतर पहले से ही संदर्भ से स्पष्ट है। पूर्व एक फ़ंक्शन कॉल के भीतर होता है , और बाद वाले को वर्तमान इंडेंटेशन स्तर पर अकेले खड़े होने की आवश्यकता होती है। IMO, 5-6 वर्णों से अधिक लंबे नाम के लिए (अर्थात अधिकांश के लिए वास्तविक जीवन), रिक्त स्थान वाला संस्करण अधिक पठनीय है।
एक्सल

13

मैं डिफ़ॉल्ट तर्क के रूप में very_long_variable_name का उपयोग नहीं करूंगा। तो इस पर विचार करें:

func(1, 2, axis='x', angle=90, size=450, name='foo bar')

इस पर:

func(1, 2, axis = 'x', angle = 90, size = 450, name = 'foo bar')

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


1
वे कीवर्ड तर्क हैं, इसी तरह का एक उदाहरण पीईपी में है, मैंने इसे केवल कम पठनीय बनाया है
सोलह

3
आप (अनिवार्य रूप से) कह रहे हैं: नो-स्पेस नियम को समझदार बनाने के लिए, बहुत कम परिवर्तनीय नाम लिखें। लेकिन अगर किसी के पास लंबे-ईश चर नाम हैं, तो नो-स्पेस नियम अव्यवस्थित वातावरण के लिए बनाता है। यह तर्क कि 'यह एक असाइनमेंट नहीं है, इसलिए वे अलग-अलग चीजें हैं' यह मेरे लिए कटौती नहीं करता है, क्योंकि मैं शब्दार्थ के बारे में की तुलना में अधिक योग्यता की परवाह करता हूं और क्योंकि अगर यह 'असाइनमेंट के लिए डिफ़ॉल्ट मान' नहीं है, तो क्या है यह?
पैट्रिक

1
@PatrickT तर्क "यह एक असाइनमेंट नहीं है, इसलिए वे अलग-अलग चीजें हैं" यह समझाने के लिए कुछ भी नहीं करता है कि यह क्यों है (एक दार्शनिक शेर); यह केवल यह बताता है कि ऐसा क्यों हो सकता है (एक वाक्यगत धारणा)।
मतीन उल्हाक

11

पेशेवरों और विपक्ष हैं।

मुझे बहुत नापसंद है कि PEP8 अनुरूप कोड कैसे पढ़ता है। मैं इस तर्क में नहीं खरीदता हूं कि very_long_variable_name=another_very_long_variable_nameकभी भी अधिक मानव पठनीय हो सकता है very_long_variable_name = another_very_long_variable_name। ऐसा नहीं है कि लोग कैसे पढ़ते हैं। यह एक अतिरिक्त संज्ञानात्मक भार है, विशेष रूप से सिंटैक्स हाइलाइटिंग की अनुपस्थिति में।

हालांकि, एक महत्वपूर्ण लाभ है। यदि रिक्ति नियमों का पालन किया जाता है, तो यह विशेष रूप से टूल का उपयोग करके मापदंडों की खोज करना अधिक प्रभावी है।


ठीक है, अगर आप चारों ओर रिक्त स्थान रखने का पालन करते हैं =, साधनों का उपयोग करके खोजना कोई भिन्न नहीं होना चाहिए।
NoName

10

IMO के लिए रिक्त स्थान छोड़ने से arg / value जोड़े के क्लीनर दृश्य समूहन प्रदान करता है; यह कम बरबाद दिखता है।


मुझे आमतौर पर रिक्त स्थान पसंद हैं, इसलिए मैं कोष्ठक के अंदर रिक्त स्थान रखना चाहता हूं और साथ ही सभी पैरामीटर अंतरिक्ष से घिरे हैं। लेकिन मुझे लगता है कि arg1=40रिश्ता अधिक स्पष्ट है क्योंकि यह अधिक पठनीय है।
चार्ली गोरीचांझ

3

मुझे लगता है कि इसके कई कारण हो सकते हैं, हालांकि मैं सिर्फ तर्कसंगत हो सकता हूं:

  1. यह अंतरिक्ष को बचाता है, एक पंक्ति में फिट होने के लिए अधिक फ़ंक्शन परिभाषाओं और कॉल की अनुमति देता है और तर्क नामों के लिए अधिक स्थान को सहेजता है।
  2. प्रत्येक कीवर्ड और मान को जोड़कर, आप अल्पविराम के बाद अलग-अलग तर्कों को अंतरिक्ष द्वारा आसानी से अलग कर सकते हैं। इसका मतलब यह है कि आप जल्दी से आँख बंद कर सकते हैं कि आपने कितने तर्क दिए हैं।
  3. सिंटैक्स तब चर असाइनमेंट से अलग होता है, जिसका नाम समान हो सकता है।
  4. इसके अतिरिक्त, सिंटैक्स समता जांच से अलग (और भी) है a == bजो किसी कॉल के अंदर मान्य अभिव्यक्ति हो सकती है।

3

मेरे लिए यह कोड को अधिक पठनीय बनाता है और इस प्रकार यह एक अच्छा सम्मेलन है।

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

अगर कोई अन्य कारणों थे, हम पसंद करेंगे foo = 42करने के लिए foo=42, क्योंकि बाद कैसे बराबर होती लक्षण आम तौर पर स्वरूपित हैं, और क्योंकि पूर्व अच्छी तरह से नेत्रहीन चर और सफेद स्थान के साथ मूल्य को अलग करती है नहीं है।

लेकिन जब एक पंक्ति में कई असाइनमेंट होते हैं, तो हम पसंद करते f(foo=42, bar=43, baz=44)हैं f(foo = 42, bar = 43, baz = 44), क्योंकि पूर्व दृष्टिगत रूप से व्हॉट्सएप के साथ कई असाइनमेंट को अलग करता है, जबकि बाद वाला नहीं करता है, यह देखने के लिए थोड़ा कठिन है कि कीवर्ड / मूल्य जोड़े कहां हैं।

यहाँ डालने का एक और तरीका है: वहाँ है सम्मेलन के पीछे एक निरंतरता। वह निरंतरता यह है: "अलगाव के उच्चतम स्तर" को रिक्त स्थान के माध्यम से नेत्रहीन रूप से स्पष्ट किया जाता है। अलगाव का कोई भी निम्न स्तर नहीं है (क्योंकि यह उच्च स्तर को अलग करने वाले व्हाट्सएप के साथ भ्रमित होगा)। वेरिएबल असाइनमेंट के लिए, वेरिएबल का उच्चतम स्तर वेरिएबल और वैल्यू के बीच है। फ़ंक्शन कीवर्ड असाइनमेंट के लिए, अलगाव का उच्चतम स्तर स्वयं व्यक्तिगत असाइनमेंट के बीच है।

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