चर और फ़ंक्शन नामों के लिए पायथन में नामकरण सम्मेलन क्या है?


772

C # बैकग्राउंड से आने वाला नामकरण कन्वेंशन चर और विधि के नाम के लिए होता है, जो आमतौर पर कैमलकेस या पास्कलकेस होता है:

// C# example
string thisIsMyVariable = "a"
public void ThisIsMyMethod()

पायथन में, मैंने ऊपर देखा है, लेकिन मैंने अंडरस्कोर का उपयोग भी देखा है:

# python example
this_is_my_variable = 'a'
def this_is_my_function():

क्या पायथन के लिए एक अधिक बेहतर, निश्चित कोडिंग शैली है?

जवाबों:


867

पायथन पीईपी 8 देखें : फ़ंक्शन और परिवर्तनीय नाम :

पठनीयता को बेहतर बनाने के लिए आवश्यक रूप से अंडरस्कोर द्वारा अलग किए गए शब्दों के साथ फ़ंक्शन नाम को कम किया जाना चाहिए ।

चर नाम फ़ंक्शन नाम के समान कन्वेंशन का अनुसरण करते हैं।

मिश्रित संदर्भ केवल उन्हीं संदर्भों में अनुमत है, जहां पहले से ही प्रचलित शैली (उदाहरण के लिए थ्रेडिंगहोम ) है, जो पश्चगामी संगतता बनाए रखने के लिए है।


127
PEP = पायथन एन्हांसमेंट प्रस्ताव।
पीटर मोर्टेंसन

8
@RickyRobinson आप किस ब्रेन-डेड कोड संपादक का उपयोग कर रहे हैं, जो यह नहीं जानता कि अंडरस्कोर एक शब्द जारी है? बहुत सारे मुफ्त जो करते हैं। अगर कोई आईडीई उपलब्ध नहीं है, तो मैं नोटपैड ++ का उपयोग करता हूं। उसके लिए, अजगर संपादन के लिए एक टेम्पलेट डाउनलोड कर सकते हैं। (अन्य भी अधिक उपयोगी मुफ्त डाउनलोड की सिफारिश कर सकते हैं।)
टूलमेकर

57
अंडरस्कोर शैली के लिए एक मामला यह है कि आप एक-अक्षर-शब्दों का बेहतर उपयोग कर सकते हैं। के लिए (बल्कि मूर्खतापूर्ण) उदाहरण, findMeAClassशायद की तुलना में बदसूरत है find_me_a_class
हेल्टनबिकर

9
मुझे लगता है कि सभी-लोअरकेस चर नामों का कन्वेंशन वैज्ञानिक कंप्यूटिंग में उपयुक्त नहीं है, जहां एक अक्सर प्रसिद्ध स्थिरांक, दसियों आदि के बीच आता है जो कि बड़े अक्षरों द्वारा निरूपित किए जाते हैं।
andreasdr 20

12
@rr PEP8 एक "स्टाइल गाइड" है, और खुद को एक कन्वेंशन के रूप में वर्णित करता है, न कि एक मानक। यह उन "नियमों" का हमेशा पालन न करने के कारणों को भी स्पष्ट रूप से बताता है।
ताहण

709

गूगल अजगर स्टाइल गाइड इन नियमों का पालन किया है:

module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_CONSTANT_NAME, global_var_name, instance_var_name, function_parameter_name, local_var_name

एक समान नामकरण योजना को लागू किया जाना चाहिए CLASS_CONSTANT_NAME


37
a) मुझे उदाहरण पसंद हैं - धन्यवाद। ख) कैमलकेस और अंडरस्कोर का अनाकर्षक मिश्रण? लेकिन: पायथन और उसके अधिक लचीले डेटा मॉडल के लिए नया होने के नाते, मुझे यकीन है कि Google के गाइड के पीछे ठोस सोच है ...
मैथ्यू कॉर्नेल

19
जब तक आप उससे चिपके रहते हैं तब तक @MatthewCornell का मिश्रण खराब नहीं होता है। यह वास्तव में पठनीयता को आसान बनाता है यदि आप जानते हैं कि कार्यों में अंडरस्कोर और कक्षाएं नहीं हैं।
पिथिकोस

1
@MatthewCornell मुझे लगता है कि यह अजगर के साथ कुछ नहीं करना है। जाओ वास्तव में सुंदरता के मनमाने मानकों को लागू करता है और यदि आप इसका पालन नहीं करते हैं, तो उदाहरण के लिए, उनके घुंघराले ब्रेस के हस्तक्षेप को संकलित करने में विफल रहेंगे। अनिवार्य रूप से, यह एक पासा रोल है कि क्या किसी ने वास्तव में सावधान सोचा था, या बस वास्तव में जिस तरह से वे चीजें करते हैं, उससे प्यार करते थे।
पार्थियन ने

क्या आप निरंतर स्थिर विशेषता GLOBAL_CONSTANT_NAME पर विचार करेंगे? यह बिल्कुल वैश्विक नहीं है क्योंकि यह वर्ग के दायरे में है।
जेम्स टी।

फिर चलता है property... शायद यह बात है कि आइटम क्या होने का नाटक कर रहा है, बजाय इसके कि वास्तव में क्या है
joelb

240

डेविड Goodger ( "कोड की तरह एक Pythonista" में यहाँ ) पीईपी 8 सिफारिशों का वर्णन इस प्रकार है:

  • joined_lower कार्यों, विधियों, विशेषताओं, चर के लिए

  • joined_lowerया ALL_CAPSस्थिरांक के लिए

  • StudlyCaps कक्षाओं के लिए

  • camelCase केवल पहले से मौजूद सम्मेलनों के अनुरूप


3
+1 दृश्य उदाहरण। हालांकि मैं यह नहीं देख पाया कि पीईपी 8 में कांस्टेंट के joined_lowerलिए क्या सुझाव है , केवल "सभी बड़े अक्षरों वाले अंडरस्कोर जो शब्दों को अलग कर रहे हैं"। नई enum सुविधा के बारे में भी उत्सुक ।
बॉब स्टीन

1
StudlyCaps for classesलगभग सभी भाषाओं में कक्षाओं के लिए एक महान सार्वभौमिक नियम है। फिर कुछ अजगर अंतर्निहित कक्षाओं में क्यों हैं (जैसे कि datetime.datetimeइस सम्मेलन का पालन नहीं किया जाता है?
प्रहलाद यारी

3
@PrahladYeri: दुर्भाग्य से, unittest.TestCase.assertEqualऔर दोस्तों को स्नेक_केस सम्मेलन का पालन नहीं होता है। सच्चाई यह है कि सम्मेलनों के जमने से पहले पायथन मानक पुस्तकालय के कुछ हिस्सों को विकसित किया गया था, और हम अब उनके साथ फंस गए हैं।
व्रजिन

3
CamelCase भ्रमित कर रहा है क्योंकि कुछ लोग कहते हैं कि यह "CamelCase" ("मिश्रितकैस" के रूप में भी जाना जाता है) और कुछ लोग कहते हैं कि यह "CamelCase" (जिसे "StudlyCaps" भी कहा जाता है)। उदाहरण के लिए, PEP में "CamelCase" का उल्लेख है, जबकि आप "CamelCase" का उल्लेख करते हैं।
प्रो क्यू

आपका यहां लिंक मृत है, हो सकता है कि इसे david.goodger.org/projects/pycon/2007/idiomatic
वुल्फ

42

पायथन कोड के लिए स्टाइल गाइड के रूप में ,

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

ध्यान दें कि यह सिर्फ पायथन के मानक पुस्तकालय को संदर्भित करता है । यदि उन्हें वह सुसंगत नहीं मिल सकता है , तो आमतौर पर सभी पायथन कोड के लिए आम तौर पर पालन-किए गए सम्मेलन होने की बहुत उम्मीद है , क्या वहाँ है?

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

मुझे एक विधर्मी के रूप में खारिज करने के लिए स्वतंत्र महसूस करें। :-) ओपी की तरह, मैं "पाइथोनिस्टा" नहीं हूँ, वैसे भी नहीं।


32

नहीं है पीईपी 8 , के रूप में अन्य उत्तर दिखाते हैं, लेकिन पीईपी 8 मानक पुस्तकालय के लिए केवल styleguide है, और यह केवल सुसमाचार उसमें के रूप में लिया है। कोड के अन्य टुकड़ों के लिए पीईपी 8 के सबसे लगातार विचलन में से एक चर नामकरण है, विशेष रूप से तरीकों के लिए। कोई एकल पूर्वसमीय शैली नहीं है, हालांकि मिश्रित कोड का उपयोग करने वाले कोड की मात्रा को देखते हुए, यदि कोई एक सख्त जनगणना करने के लिए था, तो संभवतः पीईसी 8 के एक संस्करण के साथ मिश्रितकेस के साथ समाप्त हो जाएगा। PEP 8 से थोड़ा अन्य विचलन है जो काफी सामान्य है।


9
इसका उत्तर '08 'में दिया गया हो सकता है, लेकिन आजकल लगभग सभी प्रमुख पुस्तकालय PEP 8 नामकरण सम्मेलनों का उपयोग करते हैं।
ठाणे ब्रिमहल

28

जैसा कि उल्लेख किया गया है, पीईपी 8 lower_case_with_underscoresचर, विधियों और कार्यों के लिए उपयोग करने के लिए कहता है ।

मैं lower_case_with_underscoresचर के लिए और mixedCaseविधियों और कार्यों के लिए उपयोग करना पसंद करता हूं और कोड को अधिक स्पष्ट और पठनीय बनाता है। इस प्रकार पायथन के "स्पष्ट रूप से निहित से बेहतर है" और "पठनीयता मायने रखता है" के ज़ेन का पालन ​​करना


3
+1 मैं उन दोनों को स्विच करता हूं (मैं वेरिएबल्स के लिए मिक्सकेस का उपयोग करता हूं), लेकिन सब कुछ अधिक विशिष्ट होने के कारण यह तुरंत स्पष्ट कर देता है कि आप किसके साथ काम कर रहे हैं, खासकर जब से आप फ़ंक्शन के आसपास से गुजर सकते हैं।
जिओनीग चियामियोव जूल

2
हालांकि "पठनीयता" अत्यधिक व्यक्तिपरक है। मैं और अधिक पठनीय अंडरस्कोर के साथ तरीके पाते हैं।
पिथिकोस

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

21

आगे @JohnTESlade ने जो जवाब दिया है। Google का अजगर शैली गाइड में कुछ बहुत साफ सिफारिशें हैं,

नाम से बचें

  • काउंटर या पुनरावृत्तियों को छोड़कर एकल वर्ण नाम
  • किसी भी पैकेज / मॉड्यूल नाम में डैश (-)
  • \__double_leading_and_trailing_underscore__ names (अजगर द्वारा आरक्षित)

नामकरण परंपरा

  • "आंतरिक" का अर्थ एक वर्ग के भीतर एक मॉड्यूल या संरक्षित या निजी के लिए आंतरिक है।
  • एक एकल अंडरस्कोर (_) को प्रस्तुत करने से मॉड्यूल चर और कार्यों की रक्षा के लिए कुछ समर्थन होता है (आयात से * शामिल नहीं)। एक उदाहरण चर या विधि के लिए एक डबल अंडरस्कोर (__) को प्रस्तुत करना प्रभावी ढंग से चर या विधि को अपनी कक्षा में निजी बनाने के लिए कार्य करता है (नाम mangling का उपयोग करके)।
  • संबंधित कक्षाओं और शीर्ष-स्तरीय कार्यों को एक मॉड्यूल में एक साथ रखें। जावा के विपरीत, अपने आप को प्रति मॉड्यूल एक वर्ग तक सीमित करने की आवश्यकता नहीं है।
  • CapWordsवर्ग नामों के लिए उपयोग करें , लेकिन lower_with_under.pyमॉड्यूल नामों के लिए। यद्यपि कई मौजूदा मॉड्यूल नाम हैं CapWords.py, यह अब हतोत्साहित किया जाता है क्योंकि यह भ्रमित होता है जब मॉड्यूल एक वर्ग के नाम पर होता है। ("रुको - मैंने लिखा था import StringIOया from StringIO import StringIO?")

गाइडो की सिफारिशों से व्युत्पन्न दिशानिर्देश यहां छवि विवरण दर्ज करें


17

अधिकांश अजगर लोग अंडरस्कोर पसंद करते हैं, लेकिन यहां तक ​​कि मैं अभी 5 साल से अधिक समय से अजगर का उपयोग कर रहा हूं, फिर भी मैं उन्हें पसंद नहीं करता। वे बस मुझे बदसूरत लगते हैं, लेकिन शायद मेरे दिमाग में यह सब जावा है।

मैं बस CamelCase की तरह बेहतर है क्योंकि यह वर्गों के नाम के साथ बेहतर फिट बैठता है, की तुलना में यह अधिक तार्किक लगता SomeClass.doSomething()है SomeClass.do_something()। यदि आप अजगर में वैश्विक मॉड्यूल सूचकांक में चारों ओर देखते हैं, तो आपको दोनों मिलेंगे, जो इस तथ्य के कारण है कि यह विभिन्न स्रोतों से पुस्तकालयों का संग्रह है जो समय के साथ बढ़े और ऐसा कुछ नहीं जो एक कंपनी द्वारा विकसित किया गया था जैसे कि सूर्य सख्त कोडिंग नियमों के साथ। । मैं कहूंगा कि नीचे की रेखा है: जो भी आपको बेहतर लगे उसका उपयोग करें, यह सिर्फ व्यक्तिगत स्वाद का सवाल है।


10
मैं एक जावा बैकग्राउंड से आ रहा हूं, और मुझे केवल बाद वाली राय के साथ अंडरस्कोर वर्बोज़ और अनाकर्षक लगता है। नामकरण कुछ मामलों में पठनीयता और संक्षिप्तता के बीच एक संतुलन है। यूनिक्स बहुत दूर चला जाता है, लेकिन इसका en.wikipedia.org/wiki/Domain-specific_language सीमित है। CamelCase कैप के कारण पठनीय है, लेकिन कोई अतिरिक्त वर्ण नहीं है। 2 सी
मैथ्यू कॉर्नेल

2
मेरे लिए अंडरस्कोर कार्य / विधियों में आकर्षक हैं क्योंकि मैं हर अंडरस्कोर को एक वर्चुअल (मेरे सिर में) नाम स्थान के लिए एक विभाजक के रूप में देखता हूं। इस तरह मैं आसानी से कैसे अपने नए कार्य / तरीकों नाम के लिए पता कर सकते हैं: make_xpath_predicate, make_xpath_expr, make_html_header,make_html_footer
Pithikos

3
आप (आम तौर पर) कॉल SomeClass.doSomething()(स्थिर तरीके आमतौर पर दुर्लभ नहीं होते हैं) आप आमतौर पर कॉल करते हैंan_instance.do_something()
डेव

15

व्यक्तिगत रूप से मैं कक्षाओं, मिश्रित विधि और कार्यों के लिए कैमलकेस का उपयोग करने की कोशिश करता हूं। चर आमतौर पर अंडरस्कोर अलग होते हैं (जब मैं याद कर सकता हूं)। इस तरह से मैं एक नज़र में बता सकता हूँ कि वास्तव में मैं क्या कह रहा हूँ, बजाय सब कुछ समान दिखने के।


15
ऊंट का मामला "कैमलकेज़" जैसे छोटे अक्षर IIRC से शुरू होता है।
UnkwnTech

11
मुझे लगता है कि क्रिस्टलटाइस के पास यह सही था - कम से कम, उसका उपयोग पीईपी 8 (कैमलकेस और मिक्सकैस) में उपयोग के अनुरूप है।
जरेट

1
@UnkwnTech FirstLetterUpper के लिए शब्द को कभी-कभी PascalCase कहा जाता है
SurpriseDog

CamelCase या CamelCase? बस सोच रहा।
सुमित पोखरेल

11

इस बारे में एक पेपर है: http://www.cs.kent.edu/~jmaletic/papers/ICPC2010-CamelCaseUnderScoreClouds.pdf

टीएल; डीआर यह कहता है कि साँप_केस ऊंट की तुलना में अधिक पठनीय है। इसीलिए आधुनिक भाषाएं जहां चाहे सांप का इस्तेमाल कर सकती हैं (या इस्तेमाल करना चाहिए)।


9
दिलचस्प बात यह है कि यह भी कहा गया है, "इस अध्ययन के परिणाम जरूरी नहीं कि स्रोत कोड में एम्बेडेड पहचानकर्ताओं पर लागू हो। यह पूरी तरह से संभव है कि ऊंट-आवरण पहचानकर्ता एक बेहतर जेस्टाल्ट तत्व के रूप में कार्य कर सकते हैं जब प्रोग्रामिंग निर्माण के अंदर एम्बेडेड होता है।"
रोब

2

कोडिंग शैली आमतौर पर एक संगठन की आंतरिक नीति / सम्मेलन मानकों का हिस्सा होती है, लेकिन मुझे लगता है कि सामान्य तौर पर, अजगर में all_lower_case_underscore_separator शैली (जिसे स्नेक_केस भी कहा जाता है) सबसे आम है।


0

मैं व्यक्तिगत रूप से अन्य प्रोग्रामिंग भाषाओं में विकसित होने पर जावा के नामकरण सम्मेलनों का उपयोग करता हूं क्योंकि यह सुसंगत और आसान है। इस तरह मैं लगातार इस बात पर संघर्ष नहीं कर रहा हूं कि कौन सी परंपराओं का उपयोग करना चाहिए जो मेरी परियोजना का सबसे कठिन हिस्सा नहीं होना चाहिए!


मैं कुछ हद तक सहमत हूं। यदि भाषा X केवल प्रोजेक्ट की एक छोटी राशि है, तो टेक्स्ट को प्रारूपित करने का संदर्भ स्विच बोझ हो सकता है। मुख्य हिचकी यह है कि पुस्तकालयों में एक शैली ( library_function(my_arg)) में कॉल होंगे ।
लैन

-2

आमतौर पर, एक भाषा के मानक पुस्तकालय में उपयोग किए जाने वाले सम्मेलनों का पालन करता है।

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