पाइलिंट एकल वर्ण चर नामों पर आपत्ति क्यों करता है?


96

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

for x in x_values:
   my_list.append(x)

और जब मैं दौड़ता हूं pylint, तो मुझे Invalid name "x" for type variable (should match [a-z_][a-z0-9_]{2,30}पता चलता है - जो बताता है कि एक वैध चर नाम 3 और 31 वर्णों के बीच लंबा होना चाहिए, लेकिन मैंने पीईपी 8 नामकरण सम्मेलनों के माध्यम से देखा है और मुझे एकल निचले अक्षरों के संबंध में कुछ भी स्पष्ट नहीं दिखता है , और मुझे बहुत सारे उदाहरण दिखाई देते हैं जो उनका उपयोग करते हैं।

क्या पीईपी 8 में मुझे कुछ याद आ रहा है या क्या यह एक मानक है जो पाइलिंट के लिए अद्वितीय है?

जवाबों:


47

PyLint न केवल PEP8 सिफारिशों की जाँच करता है। इसकी अपनी सिफारिशें भी हैं, जिनमें से एक यह है कि एक चर नाम वर्णनात्मक होना चाहिए और बहुत छोटा नहीं होना चाहिए।

ऐसे छोटे नामों से बचने के लिए आप इसका उपयोग कर सकते हैं:

my_list.extend(x_values)

या PyLint के कॉन्फ़िगरेशन को बताने के लिए PyLint के कॉन्फिगरेशन को ट्वीक करें


10
_अस्थायी मान रखने के लिए उपयोग करना एंटीपैटर्न है। अंडरस्कोर चर अप्रासंगिक / त्याग किए गए मानों को इंगित करते हैं, न कि अस्थायी असाइनमेंट, जैसे iया x। इसके अलावा, दुभाषिया में अंतिम अभिव्यक्ति के अंतिम मूल्य को रखने के लिए इसका विशेष अर्थ है।
जेम्स

121

एलेक्स ने जो नोट किया है, उस पर थोड़ा और विस्तार से: आप PyLint को चर नामों के अपवाद बनाने के लिए कह सकते हैं, जो (आप पिंकी शपथ) तीन वर्णों से कम होते हुए भी पूरी तरह से स्पष्ट हैं। शीर्ष लेख के अंतर्गत अपनी pylintrc फ़ाइल में खोजें या जोड़ें [FORMAT]:

# Good variable names which should always be accepted, separated by a comma
good-names=i,j,k,ex,Run,_,pk,x,y

यहाँ pk (प्राथमिक कुंजी के लिए), x और y चर नाम हैं जिन्हें मैंने जोड़ा है।


7
यह सबसे अच्छा जवाब है।
जिओर्जिओरोनोई

1
में काम करने के लिए प्रतीत नहीं होता है pylint 1.8.3pylint.pycqa.org/en/1.8/user_guide/options.html
जेम्स

हाँ यह करता है। pylint.pycqa.org/en/1.8/technical_reference/…
Aratz

2
क्या मैं वास्तव में पसंद करता हूँ जब वे समझ में उपयोग किए जाते हैं तो पाइलिंट स्वीकार (अनुरोध पर) लघु संस्करण है। तुलना return [customer_address for customer_address in thing.get_customer_addresses() if customer_address.is_proper()] बनाम return [a for a in thing.get_customer_addresses() if a.is_proper()] मैं दावा करता हूं कि उत्तरार्द्ध अधिक स्पष्ट है, जैसा कि संदर्भ से स्पष्ट है। सामान्य तौर पर, चर की लंबाई को चर के दायरे के साथ सहसंबंधित होना चाहिए।
EdvardM

21

दृढ़ता से टाइप की गई भाषाओं में, 1 अक्षर का नाम चर ठीक-ईश हो सकता है, क्योंकि आपको आमतौर पर चर की घोषणा में या फ़ंक्शन / विधि प्रोटोटाइप में नाम के बगल में टाइप मिलता है:

bool check_modality(string a, Mode b, OptionList c) {
    ModalityChecker v = build_checker(a, b);
    return v.check_option(c);
}

पायथन में, आपको यह जानकारी नहीं मिलती है, इसलिए यदि आप लिखते हैं:

def check_modality(a, b, c):
    v = build_checker(a, b)
    return v.check_option(c)

आप रखरखाव टीम के लिए बिल्कुल कोई सुराग नहीं छोड़ रहे हैं क्योंकि फ़ंक्शन क्या कर सकता है, और इसे कैसे कहा जाता है, और यह क्या रिटर्न देता है। तो पायथन में, आप वर्णनात्मक नाम का उपयोग करते हैं:

def check_modality(name, mode, option_list):
    checker = build_checker(name, mode)
    return checker.check_option(option_list)

और आप एक डॉकस्ट्रिंग भी जोड़ते हैं जो समझाता है कि सामान क्या करता है और किस प्रकार की अपेक्षा की जाती है।


7
"संकलित भाषाओं" के बजाय, मैं "स्पष्ट रूप से टाइप किया गया" लिखूंगा। हास्केल, जैसे, संकलित भी है, फिर भी आप पायथन में निहित घोषणाएं लिख सकते हैं।
सेबेस्टियन मच

14
जबकि मैं इन मामलों में आपसे सहमत हूं, एक चर नाम में 3 या अधिक वर्णों को मजबूर करने का मतलब यह नहीं है कि यह वर्णनात्मक होगा। मैं वर्तमान में with open(FILE) as f: items = f.readlines()उदाहरण के लिए उपयोग कर रहा हूं , जहां चर fवास्तव में स्पष्ट है, लेकिन मुझे पाइलिंट चेतावनी मिलती है। इसने मुझे फ्लेक 8 में बदल दिया।
एक्सल Axrn Sigurðsson

3
आप 'f' को 'वैरिएबल' नाम देने के लिए पाइलिंट नियम भी बदल सकते हैं। I, j AFAIR के लिए पहले से ही कुछ अपवाद हैं।
gurney एलेक्स

10
इस उत्तर को अस्वीकार करने वाले लोगों के लिए: मैं वह व्यक्ति हूं जिसने पाइलिंट में शासन की शुरुआत की थी, और इसका कारण बिल्कुल यही है। आप इस निर्णय से सहमत नहीं हो सकते हैं, लेकिन फिर भी यह सवाल का जवाब है ...
gurney alex

1
मैं पूरी तरह से आपके तर्क का पालन करता हूं, हालांकि अक्सर एल्गोरिदम और गणितीय प्रोग्रामिंग में कुछ मूल्यों को आमतौर पर एक अक्षर के साथ नाम दिया जाता है। मुझे लगता है कि एक फ़ंक्शन कहा जाता fहै एक OptionListसी कहा से पूरी तरह से अलग है । खासकर जब मैं इसका नाम नहीं बदल सकता functionक्योंकि यह बिल्ट-इन छाया देता है।
kap

19

आजकल regexp को ओवरराइड करने का विकल्प भी है। यानी यदि आप एकल वर्णों को चर के रूप में अनुमति देना चाहते हैं:

pylint --variable-rgx="[a-z0-9_]{1,30}$" <filename>

तो, pylintPEP8 से मेल खाएगा और शीर्ष पर अतिरिक्त उल्लंघन नहीं लाएगा। इसके अलावा आप इसे जोड़ सकते हैं .pylintrc


3
संस्करण के लिए > 1.8.3यह उत्तर लगता है। .pylintrcस्थायी विन्यास के लिए इसे अपने साथ रख सकते हैं variable-rgx=[a-z0-9_]{1,30}$:।
जेम्स

7
- परिवर्तनीय-आरजीएक्स = "[ए-जेड _] [ए-जेड0-9 _] {0,30} $" थोड़ा अधिक उपयुक्त हो सकता है, "9" एक मान्य चर नाम नहीं होना चाहिए।
एरिक ले फोर्ट

16

गहरा कारण तुम्हें याद कर सकते हैं कि आप क्या इरादा है a, b, c, x, y, और zइसका मतलब यह है कि जब आप अपने कोड लिखा था, लेकिन जब वह अन्य लोगों को पढ़ा है, या यहाँ तक कि जब आप अपने कोड पर वापस आते हैं, कोड जब आप दे और अधिक पठनीय बन जाता है यह एक शब्दार्थ नाम है। हम एक चॉकबोर्ड पर एक बार सामान नहीं लिख रहे हैं और फिर उसे मिटा रहे हैं। हम एक ऐसा कोड लिख रहे हैं जो एक दशक या उससे अधिक समय तक चिपका रह सकता है, और कई बार पढ़ा जा सकता है।

अर्थ नाम का प्रयोग करें। सिमेंटिक नाम मैं का उपयोग किया है किया गया है की तरह ratio, denominator, obj_generator, path, आदि यह एक अतिरिक्त दूसरे या दो उन्हें बाहर टाइप करने के लिए समय लग सकता है, लेकिन समय आप यह पता लगाने की क्या तुम भी आधा तो से एक घंटे में लिखा था की कोशिश कर सेव यह अच्छी तरह से लायक है ।


7
धन्यवाद। यहाँ अंतिम कोड है - gist.github.com/amandabee/8969833 - मैं कोड के बारे में आपकी बात देखता हूं जिसे मैं (या आप) एक वर्ष में पढ़ सकता हूं, लेकिन इस मामले में, मुझे लगता है कि x और y वास्तव में वर्णनात्मक हैं।
अमांडा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.