2016-05-10 9 views
9

मैं एक परियोजना पर काम कर रहा हूं कि लगभग हर जगह तर्क कुंजी द्वारा पारित किया जाता है। केवल कीवर्ड (डिफ़ॉल्ट मान) पैराम या दोनों के मिश्रण के साथ, स्थितित्मक पैरा के साथ फ़ंक्शन हैं। उदाहरण के लिए निम्नलिखित कार्य:कार्यों के लिए तर्क पारित करने के लिए पाइथोनिक तरीका क्या है?

def complete_task(activity_task, message=None, data=None): 
    pass 

वर्तमान कोड में यह कार्य इस तरह कहा जा सकता है:

complete_task(activity_task=activity_task, message="My massage", data=task_data) 

मेरे लिए वहाँ तर्क जिसका नाम के संदर्भ द्वारा स्पष्ट है नाम के लिए कोई मतलब नहीं है चर निष्पादन/चर नाम से। मैं इसे इस तरह कहेंगे:

complete_task(activity_task, "My message", task_data) 

कुछ मामलों में जहां यह स्पष्ट नहीं है कि क्या एक कॉल तर्क संदर्भ से है, या चर नाम से अनुमान लगाया, मैं क्या कर सकता है:

complete_task(activity_task, message="success", task_data=json_dump) 

तो इसने मुझे आश्चर्यचकित कर दिया कि यदि स्थिति तर्क/पुन: व्यवस्थित करने की आवश्यकता नहीं है या कुछ कीवर्ड पैराम्स के लिए डिफ़ॉल्ट मानों का उपयोग करने की आवश्यकता नहीं है, तो स्थितित्मक/कीवर्ड पैराम, के साथ फ़ंक्शंस कॉल करने के लिए कोई सम्मेलन या "पायथनिक" तरीका है।

+3

आप विधियों के साथ कार्यों को भ्रमित कर रहे हैं। आपकी पोस्ट में सबकुछ एक कार्य है, एक विधि नहीं। –

+2

@ टोमकारज़: मेह, पायथन उन चीजों के बीच शायद ही अंतर करता है। एक विधि "बस" एक फ़ंक्शन है जो कक्षा से (और एक्सेस किया जाता है) से जुड़ा होता है। – Kevin

+0

@TomKarzes क्षमा करें, मैंने खुद को सही किया। मैं "विधियों" का जिक्र कर रहा था क्योंकि परियोजना में अधिकांश मामले वास्तविक तरीके हैं लेकिन उपरोक्त सरल उदाहरण के लिए, मैंने इसे एक समारोह के रूप में लिखा है। फिर भी, मेरे द्वारा विश्वास किए गए प्रश्न में बाकी सब कुछ वही लागू होता है। – ddinchev

उत्तर

4

अंगूठे मैं पालन के सामान्य नियम हैं:

  1. Booleans, विशेष रूप से बूलियन शाब्दिक, हमेशा कीवर्ड द्वारा पारित किया जाना चाहिए जब तक कि यह वास्तव में स्पष्ट वे क्या मतलब है। यह इतना महत्वपूर्ण है कि मैं अक्सर अपने स्वयं के कार्यों को लिखते समय केवल बूलियन कीवर्ड बनाउंगा। यदि आपके पास बूलियन पैरामीटर है, तो आपका फ़ंक्शन दो छोटे कार्यों में विभाजित होना चाहता है, खासकर यदि यह if boolean_parameter: do_something(); else: do_something_entirely_different() की समग्र संरचना लेता है।
  2. यदि कोई फ़ंक्शन बहुत से वैकल्पिक पैरामीटर (आवश्यक पैरामीटर सहित ~ 3 से अधिक) लेता है, तो विकल्प आमतौर पर कीवर्ड द्वारा पारित किए जाने चाहिए। लेकिन यदि आपके पास बहुत सारे पैरामीटर हैं, तो आपका फ़ंक्शन कई छोटे कार्यों में पुन: सक्रिय होना चाहता है।
  3. यदि कोई फ़ंक्शन एक ही प्रकार के एकाधिक पैरामीटर लेता है, तो संभवतः वे कीवर्ड तर्क के रूप में पारित करना चाहते हैं जब तक कि संदर्भ संदर्भ से पूरी तरह से स्पष्ट न हो (उदा। srcdest से पहले आता है)।
  4. अधिकांश समय, कीवर्ड तर्क गलत नहीं हैं। यदि आपके पास ऐसा कोई मामला है जहां स्थितित्मक तर्क भ्रमित हैं, तो आपको किसी दूसरे विचार के बिना कीवर्ड तर्कों का उपयोग करना चाहिए। सरल एक पैरामीटर फ़ंक्शंस के संभावित अपवाद के साथ, कीवर्ड तर्क आपके कोड को पढ़ने के लिए कठिन नहीं बनाएंगे।
1

पायथन के 2 प्रकार के तर्क हैं। positional और कीवर्ड (उर्फ default)। पानी एक छोटे से मैला मिलता है क्योंकि स्थितीय तर्क कीवर्ड द्वारा कहा जा सकता है और कीवर्ड तर्क स्थिति से कहा जा सकता है ...

def foo(a, b=1): 
    print(a, b) 

foo(1, 2) 
foo(a=1, b=2) 
कि कहा के साथ

, मुझे लगता है कि नाम तर्क के प्रकार के का संकेत देना चाहिए आपको (आमतौर पर) उनका उपयोग कैसे करना चाहिए। अधिकांश समय, मैं स्थिति द्वारा बुलाए गए स्थिति और कीवर्ड तर्कों द्वारा बुलाए गए स्थितित्मक तर्क देखता हूं। इसलिए, यदि आप अंगूठे के सामान्य नियम की तलाश में हैं, तो मैं सलाह दूंगा कि आप फ़ंक्शन कॉल को हस्ताक्षर की नकल करें।हमारे ऊपर foo समारोह के मामले में, मैं इसे इस तरह फोन चाहते हैं:

foo(1, b=2) 

मुझे लगता है कि एक कारण यह सलाह का पालन करने के लिए है, क्योंकि (ज्यादातर समय), लोगों को उम्मीद कीवर्ड तर्क के माध्यम से पारित होने के लिए कीवर्ड।

def foo(a, aa='1', b=2): 
    print(a, aa, b) 

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

अभी तक, बहुत अच्छा है। लेकिन जब आप कोई फ़ंक्शन बना रहे हों तो आप किन नियमों का उपयोग कर सकते हैं? आप कैसे जानते हैं कि default तर्क या positional तर्क तर्क देना है या नहीं? यह एक उचित सवाल है - और अंगूठे का अच्छा नियम ढूंढना मुश्किल है। मेरे द्वारा उपयोग किए जाने वाले अंगूठे के नियम इस प्रकार हैं:

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

Python3.x भी कीवर्ड केवल तर्क हैं। वे आपको कोई विकल्प नहीं देते हैं, इसलिए मुझे नहीं पता कि वे भी यहां चर्चा के लिए बहुत कुछ जोड़ते हैं :-) - हालांकि मुझे नहीं पता कि मैंने जंगली में अपना उपयोग बहुत अधिक देखा है ।

संबंधित मुद्दे