मुझे उन कार्यों का नाम कैसे देना चाहिए जो पायथन में मान लौटाते हैं?


13

मैं पायथन में अपने कार्यों के लिए नाम चुनने के बारे में उलझन में हूं । कभी - कभी पायथन में निर्मित कार्य आवश्यक होते हैं जैसे: printफ़ंक्शन और स्ट्रिंग विधि find। कभी-कभी वे ऐसे नहीं होते हैं: lenइसका नाम अनिवार्य नहीं है calculate_len, उदाहरण के लिए, और typeऐसा नहीं है find_type

मैं समझ सकता हूं कि printऐसा मान लौटाया जाता है जिसका हम उपयोग नहीं करते हैं (यानी None) और कुछ करता है (यानी यह स्क्रीन पर एक स्ट्रिंग दिखाता है), इसलिए इसका नाम जरूरी है।

लेकिन lenएक ऐसा मूल्य देता है जिसका हम उपयोग करते हैं और कुछ करते हैं (यानी किसी क्रम या मैपिंग में कितनी वस्तुओं की गणना होती है।) और इसका नाम अनिवार्य नहीं है । दूसरी ओर, findस्ट्रिंग विधि (के रूप में len) एक मूल्य देता है जिसका हम उपयोग करते हैं और कुछ करते हैं, और इसका नाम जरूरी है

इस प्रश्न ने जो पूछा वह यह है कि मैंने एक स्क्रिप्ट डाली जो कि सीज़र सिफर का उपयोग करके एन्क्रिप्ट और डिक्रिप्ट की गई स्ट्रिंग की समीक्षा की जा रही है। समीक्षक ने कहा कि:

बस एक आंत महसूस: कार्य सामान करते हैं। एक समारोह के लिए एक अच्छा नाम एक जरूरी है: मैं rotate_letterइसके बजाय का उपयोग करेंगे rotated_letter

rotated_letterएक एकल-अक्षर स्ट्रिंग को एक संख्या द्वारा घुमाए गए पत्र का प्रतिनिधित्व करता है। मुझे नहीं पता कि क्या बेहतर है, मैंने इसका उपयोग किया rotated_letterक्योंकि यह एक मान लौटाता है, जैसे यादृच्छिक मॉड्यूलrandint में फ़ंक्शन , यह नहीं है ।generate_randint

तो, इस मामले में, मुझे एक फ़ंक्शन का नाम कैसे देना चाहिए जो उपयोग किए जाने के लिए एक मान लौटाता है? क्या मुझे नाम अनिवार्य या सिर्फ संज्ञा देना चाहिए । अन्य मामलों में यह स्पष्ट है कि यह कैसे करना है, जैसे कि बूलियन फ़ंक्शंस , जैसे कि is_evenऔर is_palindromeहम इसे केवल एक हाँ / नहीं प्रश्न की तरह बनाते हैं , और यह भी कार्य करता है कि गैर-उपयोग किए गए मान (जैसे None) printऔर जैसे कि और सूची विधि लौटाएं sort


यह वास्तव में एक बहुत ही सामान्य अभ्यास है (मैं एक सम्मेलन कहूंगा) जब फ़ंक्शन का नामकरण किया जाता है। उदाहरण के लिए, आप एक चर का नाम कैसे देते हैं जो फ़ंक्शन के घुमाए गए अक्षर को घुमाया गया है?
जूलिनरॉज

यह आपके कुछ उदाहरणों के बारे में सोचने का एक अच्छा तरीका नहीं है। len, उदाहरण के लिए, "लंबाई" के रूप में बेहतर माना जाता है - आपको इसके तर्क का मेटा-स्तर वर्णन मिल रहा है।
इज़काता

जवाबों:


10

उन क्रियाओं का उपयोग करें जहाँ उचित, संज्ञाएँ छोटी और अस्पष्ट हैं

अधिकांश समय, फ़ंक्शंस क्रियाशील (क्रियाशील) होने चाहिए और कक्षाएं, चर और पैरामीटर संज्ञाएं होनी चाहिए। गुण भी संज्ञाएं होनी चाहिए, जिनमें उपयोग किए गए भी शामिल हैं @property। यह विशेष रूप से उन कार्यों के लिए होता है जिनके दुष्प्रभाव होते हैं। [१] यदि कोई फ़ंक्शन कुछ वापस करता है, तो आपको मूल्यांकन करना चाहिए कि क्या क्रिया कुछ जोड़ती है या सिर्फ "शोर" है:

  • make_list(foo)बनाम list(foo): संज्ञा क्रिया की तुलना में पढ़ना आसान है। इसके अलावा, listवास्तव में एक वर्ग है, और कक्षाएं संज्ञाएं होनी चाहिए।
  • open(foo)बनाम file(foo): क्रिया संज्ञा की तुलना में पढ़ने में आसान है, और यह क्रिया की तुलना में एक क्रिया को "विकल्प" देने के लिए अधिक समझ में आता है, इसलिए पायथन में संज्ञा को हटा दिया गया था। 3. open()केवल "मानक" [2] तरीका है पायथन 3 में फ़ाइल ऑब्जेक्ट बनाने के लिए।
  • foo.get_bar()बनाम foo.bar()बनाम foo.bar(मान fooऔर barदोनों संज्ञाएं हैं): पहला विकल्प, सही बाहर है, क्योंकि "मिल" कुछ भी जोड़ नहीं है कि हम पहले से ही पता नहीं था। दूसरा उपयुक्त है यदि एक से barबाहर निकलना fooएक संभावित महंगा ऑपरेशन है और / या साइड इफेक्ट करता है (आप यह भी विचार कर सकते हैं Bar(foo)कि Barक्या एक वर्ग है)। तीसरा उपयुक्त है यदि यह बिना किसी दुष्प्रभाव के एक सस्ता ऑपरेशन है, और वैकल्पिक कार्यान्वयन इसे महंगा बनाने की संभावना नहीं है
  • xs.sort()बनाम sorted(xs)अगर xsएक सूची है: पहला जरूरी है: सूची को क्रमबद्ध करें। यह सूची को जगह में संशोधित करता है और कुछ भी नहीं लौटाता है। दूसरा घोषणात्मक है: एक सूची जो क्रमबद्ध है, जो ठीक वही है जो वह लौटता है। दोनों क्रिया हैं।

[१]: आमतौर पर किसी मूल्य को लौटाने और साइड इफेक्ट्स परस्पर अनन्य होते हैं जब तक कि आपके पास उन्हें संयोजित करने के लिए कुछ सम्मोहक डिज़ाइन कारण न हों। तो एक फ़ंक्शन जिसके साइड इफेक्ट्स हैं, उसे शायद कुछ भी वापस नहीं करना चाहिए और इसलिए इसे संज्ञा बनाने से बहुत कम समझ में आएगा।
[2]: वहाँ में कुछ मामूली निचले स्तर के संचालन कर रहे हैं ioमॉड्यूल जो जोड़ें या निकालें फ़ाइल बफरिंग, स्वत: पाठ करने के लिए इस्तेमाल किया जा सकता एन / डिकोडिंग, आदि, और ये ज्यादातर संज्ञाओं क्योंकि वे वस्तु उन्मुख वर्गों रहे हैं। अधिकांश उपयोगकर्ताओं को इन चीजों के साथ सीधे खेलने की आवश्यकता नहीं है; इसके बजाय, open()एक उपयुक्त वर्ग का चयन करता है और इसे स्वचालित रूप से बताता है।


धन्यवाद! में " foo.get_bar() vs.` foo.bar ()` बनाम foo.bar" के बीच अंतर क्या है दूसरी और तीसरी ?
महमूद मुहम्मद नगेब

तीसरा या तो एक संपत्ति या एक नंगे गुण है। दूसरी एक विधि है।
केविन

इसलिए, अगर मुझे समझ में आता है, तो rotated_letterअनिवार्य नहीं है कि इसे अनिवार्य बना दिया जाए और इसे सही नहीं ठहराया जाए?
बजे महमूद मुहम्मद नगीब

इस मामले में मुझे यकीन नहीं है कि letterसंदर्भ से निहित है या नहीं ।
केविन

+1 उल्लेख करने के listलिए एक वर्ग है
डूसन मायर

0

rotated_letterएक विधि की तरह नहीं दिखता है। यह एक संपत्ति की तरह दिखता है। जिसका अर्थ है कि पहला विचार यह करना है:

var letter = caesar.rotated_letter

letterप्रकार स्ट्रिंग का मान सम्‍मिलित करने की अपेक्षा करता है, फ़ंक्शन नहीं। वहाँ से, या तो आपने एक अलग नाम चुना, जैसे:

def rotate_letter(self):
    pass

या आप इसके बजाय एक संपत्ति का उपयोग करते हैं:

@property
def rotated_letter(self):
    return self.whatever

lenऔर typeइस तरह नाम दिया गया है क्योंकि कोई अन्य नाम टाइप करने के लिए लंबा होगा। उनका बहुत उपयोग किया जाता है, और उनके पास कोर पायथन कार्यों की एक विशेष स्थिति है जो कि हर पायथन प्रोग्रामर किसी भी तरह सीखेंगे, उनके नाम तीसरे पक्ष के पुस्तकालयों के नामों की तुलना में बहुत अधिक अप्रासंगिक हैं।

len, विशेष रूप से, आपके कोड में आपको क्या नहीं करना चाहिए, इसका एक अच्छा उदाहरण है : आपसे पूर्ण नामों का उपयोग करने की अपेक्षा की जाती है, जैसे कि length(जब तक कि संक्षिप्त रूप बहुत लोकप्रिय न हो, जैसे max), और क्रिया का उपयोग करें, जैसे कि compute_length। या यह एक संपत्ति हो सकती है: len([1, 5, 6])बन जाती है [1, 5, 6].length। उदाहरण के लिए, C # में, बाद के फॉर्म का उपयोग किया जाता है new [] { ... }.Length:।

ध्यान दें कि इसके ऐतिहासिक कारण भी हो सकते हैं len: अन्य भाषाएं, जैसे कि C #, पसंदीदा Count, जो आमतौर पर एक विधि है (हालांकि व्यवहार दुर्भाग्य से .NET फ्रेमवर्क के माध्यम से असंगत है)। Countएक क्रिया है, इसलिए सहज रूप से, आप इसे एक विधि के रूप में लागू करने के लिए इच्छुक हैं।

मान लौटाना या कोई क्रिया करना

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

  • फ़ंक्शन में बमुश्किल एक return ...बयान होता है ,

  • फ़ंक्शन का नाम जो स्वाभाविक रूप से आपके दिमाग में आता है get_something, जैसा कि है product.get_price()

अब, यदि आपके पास कोई फ़ंक्शन है, तो यह चार प्रकारों में से एक हो सकता है:

  • यह शुद्ध हो सकता है, जो पर्यावरण को प्रभावित किए बिना एक मूल्य लौटाता है। उदाहरण: road.measure_distance()

  • यह बिना कुछ लौटे पर्यावरण को प्रभावित कर सकता है। उदाहरण: product_database.remove_record(1234)

  • यह पर्यावरण को प्रभावित कर सकता है और एक मूल्य लौटा सकता है। उदाहरण: value.increment()इस तरह के रूप में इस्तेमाल किया value++

  • यह कुछ भी नहीं कर सकता है और कुछ भी नहीं लौटा सकता है। उदाहरण: time.sleep(1)

ऐसे कुछ मामले हैं जहां नाम फ़ंक्शन के प्रकार के बारे में एक मजबूत संकेत दे सकता है, लेकिन कई मामलों में, आप इसके नाम से मुश्किल से प्रकार नहीं जान पाएंगे।


मुझे लगता है कि उत्तर "हाँ" है, लेकिन मुझे पूछना चाहिए: क्या आप पूरी तरह से पायथन के दृष्टिकोण से जवाब दे रहे हैं? क्योंकि अन्य भाषाओं में आपकी संपत्ति बनाम फ़ंक्शन का पृथक्करण हमेशा सच नहीं होता है; यह भी सच नहीं है कि एक फ़ंक्शन "एक क्रिया करना चाहिए"। क्या यह पायथन में सम्मेलन है? (मैं पायथन लिखता हूं, लेकिन सभी पीईपी नहीं पढ़ता हूं और मैं निश्चित रूप से विशेषज्ञ नहीं हूं। मैंने नीचे नहीं लिखा, बीटीडब्ल्यू)।
एंड्रेस एफ।

@AndresF: मैं पायथन के दृष्टिकोण से उत्तर दे रहा हूं। जावा जैसी भाषाओं में जहां गुण मौजूद नहीं हैं, getSomethingऔर setSomethingगुणों के बजाय सामान्य नाम हैं।
आर्सेनी मूरज़ेंको
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.