क्या मुझे वास्तव में अपने स्थिरांक के लिए सभी अपरकेस का उपयोग करना चाहिए?


34

मैं एक पायथन प्रोग्रामर हूं जो मुख्य रूप से लाइनिंग सोर्स कोड के लिए पाइलिंट का उपयोग करता है। मैं एक को छोड़कर सभी चेतावनियों को समाप्त करने में सक्षम हूं: एक स्थिर के लिए अमान्य नाम। सभी कैप्स का नाम बदलने से यह ठीक हो जाता है, लेकिन क्या मैं वास्तव में ऐसा करने वाला हूं? यदि मैं ऐसा करता हूं, तो मुझे पता चलता है कि मेरा कोड बदसूरत लग रहा है क्योंकि अधिकांश चर स्थिर हैं (पाइलिंट के अनुसार)।


2
यदि आपके अधिकांश चर मॉड्यूल-स्तरीय स्थिरांक हैं, तो आप शायद कुछ असामान्य कर रहे हैं। उनमें से अधिकांश को कार्यों के अंदर रहना चाहिए।
रेमकोगर्लिच

1
क्या आप हमें अपने कोड का एक नमूना दिखा सकते हैं, जो लगता है कि पाइलट निरंतर है?
विंस्टन एवर्ट

@InstonEwertNOTES_DIRECTORY = argv[1] chdir(NOTES_DIRECTORY) FILES = glob('*.txt') RAND_FILE = choice(FILES) with open(RAND_FILE) as notes_file: POINTS = notes_file.readlines() RAND_POINT = choice(POINTS)
अभिषेक कुमार

@AbhishekKumar, किसी फ़ंक्शन में आपका कोड है, या शीर्ष स्तर पर है?
विंस्टन एवर्ट

@WinstonEwert शीर्ष स्तर पर और PyLint के निर्देशों का पालन करने के बाद।
अभिषेक कुमार

जवाबों:


33

आप शायद इस तरह कोड लिख रहे हैं:

notes_director = argv[1]
chdir(notes_director)
files = glob('*.txt')
rand_file = choice(files)
with open(rand_file) as notes_file: 
    points = notes_file.readlines() 
    rand_point = choice(points)

आपको इस कोड को एक फंक्शन में ले जाना चाहिए:

def main():
    notes_director = argv[1]
    chdir(notes_director)
    files = glob('*.txt')
    rand_file = choice(files)
    with open(rand_file) as notes_file: 
        points = notes_file.readlines() 
        rand_point = choice(points)

# actually call the main function    
main()

Pylint उस कोड को मानता है जो वास्तव में काम करता है एक फ़ंक्शन के अंदर होगा। क्योंकि आपके पास यह कोड किसी फ़ंक्शन के अंदर के बजाय आपके कोड के शीर्ष स्तर पर है, यह भ्रमित हो जाता है।

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


1
दृढ़ता से असहमत, मुझे लगता है कि मॉड्यूल स्तर के चर का उपयोग करने के कई अच्छे पायथोनिक कारण हैं। मुझे लगता है कि यह सलाह पीईपी 8 को गलत ढंग से फैलाने वाले पाइलिंट की एक कलाकृति है, और "स्थिरांक को मॉड्यूल स्तर होना चाहिए" का अनुमान भी सच होना चाहिए।
मेट्रिक सिस्टम

21

हाँ। स्थिरांक पर PEP8s नियम के अनुसार :

स्थिरांक को आमतौर पर एक मॉड्यूल स्तर पर परिभाषित किया जाता है और सभी बड़े अक्षरों में अलग-अलग शब्दों के साथ लिखा जाता है। उदाहरणों में शामिल हैं MAX_OVERFLOWऔर TOTAL

दीर्घ संस्करण:

पायथन समुदाय में (कई अन्य समुदायों में) कोड लिखने के तरीके के बारे में सम्मेलनों में मौजूद हैं। यह वर्किंग कोड से अलग है : यदि आप अपने कॉन्स्टेंट को सभी लोअरकेस में लिखते हैं, तब भी आपका कोड काम करता है।

लेकिन सामुदायिक सहमति है (पीईपी 8 में दस्तावेज के रूप में) जो कि पाइलिंट जैसे उपकरणों के साथ "लागू" है । यदि आप अपनी खुद की खुशी के लिए कार्यक्रम करते हैं, तो आप संकेत दे सकते हैं कि संकेत आपको देता है। यदि आप समुदाय के साथ खुला विनिमय चाहते हैं, उर्फ ​​»मेरे अलावा किसी को मेरे कोड का उपयोग करना चाहिए«, आपको PEP8 के अनुसार अपना कोड तैयार करना चाहिए।


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

@ जूल्स मैं एक बार सेट किए गए चरों को कॉल करता हूं और रनटाइम के दौरान बदलना कभी भी एक स्थिर नहीं होता है, इसलिए कई भाषाओं में मौजूद है (जैसे जेएस में) एक constकीवर्ड। हालांकि प्रारंभिक मूल्य अलग है, शायद अन्य के अलावा PI
थॉमस जंक

1
मैं एक अपरिवर्तनीय चर (यानी कुछ ऐसा है जो रनटाइम पर सेट किया गया है और नहीं बदला है) और एक निरंतर (यानी कुछ ऐसा जो हर प्रोग्राम रन में एक ही है ) के बीच अंतर करता है, और अगर भाषा इसे करने का विकल्प प्रदान करती है तो इसे संकलन समय पर गणना की जा सकती है ) ... बात यह है कि क्योंकि अजगर के भेद को निर्दिष्ट करने के किसी भी तरीके की कमी है, pylintपूर्व के मामले में भी बाद की मान लेता है।
जूल्स

पाइलिंट निश्चित रूप से गलत है, इसमें यह पढ़ा गया है कि "स्थिरांक को मॉड्यूल स्तर होना चाहिए" और यह मान लिया कि "मॉड्यूल स्तर स्थिरांक होना चाहिए"। लेकिन क्योंकि यह एक अच्छा, उपयोगी उपकरण है, ऐसा लगता है कि हम इसके साथ फंस गए हैं।
मेट्रिक सिस्टम

@MetricSystem क्या - आपकी राय में - एक मॉड्यूल स्तर चर एक स्थिर होने के अलावा कार्य करेगा? क्या यह परस्पर होना चाहिए?
थॉमस जंक

13

PEP8 और पायथन समुदाय मानदंड का उपयोग करना है ALL_CAPS_CONSTANTS। यह एक सामान्य दृश्य सुराग है, जिसका उपयोग सी, जावा, पर्ल, पीएचपी, पायथन, बैश और अन्य प्रोग्रामिंग भाषाओं और शेल वातावरणों में दशकों से किया जाता है। लेकिन आधुनिक ऑनलाइन पार्लियामेंट में , सभी कैपसाइनिंग शाइटिंग । और चिल्लाना असभ्य है।

हालांकि, अजगर इसके बारे में असंगत है ALL_CAPS_CONSTANTS। जावास्क्रिप्ट हो सकता है Math.PI, लेकिन पायथन के पास है math.pi। There's की तुलना में कोई अधिक पहचानने योग्य या स्थायी नहीं है। या विचार करें sys.version_info, आप जिस पायथन का संस्करण चला रहे हैं। अपने कार्यक्रम के जीवन पर 100% निरंतर - दूर से अधिक PORTया MAX_ITERATIONSया अन्य स्थिरांक आपके द्वारा निर्धारित होगी। या कैसे sys.maxsize? आपके प्लेटफ़ॉर्म का अधिकतम मूल पूर्णांक मान न केवल एक या दो प्रोग्राम चलाता है, बल्कि आपके हार्डवेयर का जीवन है।

यदि ये स्थिरांक - जैसे कि const और e जैसे कि ब्रह्मांड के मूलभूत स्थिरांक हैं, और सभी अनंत काल में अलग-अलग नहीं होंगे - यदि वे निम्न-मामले हो सकते हैं, तो ठीक है ... इसलिए अन्य स्थिरांक हो सकते हैं। आप चुन सकते हैं।

याद रखें, PEP8 एक स्टाइल गाइड है। एक दिशानिर्देश, एक कानून नहीं है। एक दिशानिर्देश अक्सर पायथन के मानक पुस्तकालय द्वारा भी नियंत्रित किया जाता है। और एक अन्य मूल पायथन दिशानिर्देश का हवाला देते हुए, PEP20 (उर्फ "द ज़ेन ऑफ़ पायथन"):

  • सुंदर बदसूरत से बेहतर है
  • पठनीयता मायने रखती है
  • व्यावहारिकता शुद्धता को हरा देती है।

एक व्यावहारिक नोट पर, जब कोई प्रोग्राम होता है YELLY_CONSTANTऔर SHOUTY_PARAMETERउसे टटोलना शुरू होता है, तो यह याद रखने में मदद मिलती है कि ऑल-कैप स्थिरांक आमतौर पर प्लेटोनिक आदर्शों को सहन नहीं कर रहे हैं , लेकिन एक प्रोग्राम के पैरामीटर चलते हैं। के बारे में सही मायने में लगातार कुछ भी नहीं है PORT, SITENAMEया NUMRUNS, और वे स्टैंडअलोन कार्यक्रम वैश्विक रूप से प्रबंधित किया जा करने के लिए नहीं है। उदाहरण के लिए, उन्हें प्रोग्राम मापदंडों के विश्व स्तर पर सुलभ बंडल के रूप में एक शब्दकोश में गिराया जा सकता है:

config = {
    'port': 80,
    'sitename': "Bubba's Blog",
    'numruns': 100,
}

पायथन में एक अच्छा कीवर्ड पैरामीटर पासिंग सुविधा है जो उपयोग करने की आवश्यकता को कम करता है APPARENTLY_ANGRY_GLOBAL_VARIABLES:

def process_data(sitename, port=80, numruns=100):
    ...

process_data("Bubba's Blog")

व्यवहार में, इनमे से कई मान कंट्रोल फाइल / पैटर्न के व्युत्क्रम को संतुष्ट करने के लिए कॉन्फिग फाइल्स, OS एनवायरनमेंट वैरिएबल्स, कमांड लाइन आर्ग्युमेंट्स, या अन्य स्त्रोतों से पढ़े जाएंगे । लेकिन यह एक और दिन के लिए एक बड़ी कहानी है।


1

हां, अधिकांश प्रोग्रामिंग भाषा में यह काफी सामान्य है (कम से कम जो मैं उपयोग करता हूं)।

आप एक ही टीम के डेवलपर्स के बीच एक सामान्य शैली साझा करने के लिए इस Google लिंक का उल्लेख कर सकते हैं ।

इसका उपयोग करने की सलाह दी जाती है

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