गैर-डिफ़ॉल्ट तर्क डिफ़ॉल्ट तर्क का पालन क्यों नहीं कर सकते हैं?


138

इस कोड के टुकड़े को सिंटैक्सएयर क्यों फेंकता है?

  >>> def fun1(a="who is you", b="True", x, y):
...     print a,b,x,y
... 
  File "<stdin>", line 1
SyntaxError: non-default argument follows default argument

जबकि निम्नलिखित कोड दिखाई देने वाली त्रुटियों के बिना चलता है:

>>> def fun1(x, y, a="who is you", b="True"):
...     print a,b,x,y
... 

अजगर में यह है कि संरचना तब होती है जब आप किसी फ़ंक्शन को परिभाषित करते हैं def myfunction(position_arguments, *arguments, **keywords):`....`
abhishekgarg

जवाबों:


172

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

अपने फ़ंक्शन का उपयोग करते हुए, हम कीवर्ड तर्क पर एक नज़र डालते हैं।

def fun1(a="who is you", b="True", x, y):
...     print a,b,x,y

मान लें कि इसके कार्य को उपरोक्त रूप में घोषित करने की अनुमति है, तो उपरोक्त घोषणाओं के साथ, हम निम्नलिखित (नियमित) स्थिति या तर्क कर सकते हैं:

func1("ok a", "ok b", 1)  # Is 1 assigned to x or ?
func1(1)                  # Is 1 assigned to a or ?
func1(1, 2)               # ?

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

>>> def fun1(x, y, a="who is you", b="True"):
...     print a,b,x,y
... 

संदर्भ O'Reilly - Core-Python
जहां यह फ़ंक्शन उपर्युक्त फ़ंक्शन कॉल के लिए डिफ़ॉल्ट रूप से सही तर्क का उपयोग करता है। कीवर्ड तर्क कॉलिंग आउट-ऑफ-ऑर्डर स्थिति संबंधी तर्कों के लिए प्रदान करने में सक्षम होने के लिए उपयोगी साबित होते हैं, लेकिन, डिफ़ॉल्ट तर्कों के साथ युग्मित होने के साथ-साथ, उन्हें लापता तर्कों को "स्किप ओवर" करने के लिए भी उपयोग किया जा सकता है।


4
<q> संक्षेप में, दुभाषिया के लिए यह तय करना असंभव होगा कि कौन से मान मेल खाते हैं यदि मिश्रित मोड की अनुमति दी जाती है तो कौन सी दलीलें मिलती हैं। </ q> रूबी डिफ़ॉल्ट रूप से निम्नलिखित गैर-डिफ़ॉल्ट तर्क देता है। <q> आप फ़ंक्शन कॉल में चर का असाइनमेंट कैसे सुझाएंगे </ q> बस उपयोग करें func1(x=1, y=2)
कमजोर

हाय @weakish, टिप्पणी के लिए धन्यवाद, पायथन के पास इसे प्राप्त करने का एक अच्छा तरीका है, कृपया * args और ** kwargs के लिए खोज करें
राहुल गौतम

हाय @ राहुल गौतम मैं भ्रमित हूँ। मैंने सोचा था कि काम **kwargsनहीं कर सकता def fun1(a="who is you", b="True", x, y)या इसी तरह का। यदि आप उपयोग करते हैं def f(**kwargs), तो आपको शरीर में डिफ़ॉल्ट मानों को संभालने की आवश्यकता है?
कमजोर

@ def fun1(a="who is you", b="True", x, y)एक ही चीज़ को अलग स्टाइल से हासिल किया जाए। यदि fun1 (** kwrgs) को हराया जाए तो ` fun1({'a': 'who is you', 'b': True})x और y को पास करने की कोई आवश्यकता नहीं है।
राहुल गौतम

2
आप क्यों लिखते हैं "सिंथेटिक रूप से, दुभाषिया के लिए यह तय करना असंभव होगा कि कौन से मूल्य मेल खाते हैं जो कि अन्य मोड से अनुमति दी गई है?" मुझे लगता है कि PEP 3102 पर एल्गोरिदम ठीक उसी तरह काम कर सकता है, भले ही def foo(x=None, y)अनुमति दी जाए। इसलिए मैं अब भी उत्सुक हूं कि इसे पायथन ने अनुमति क्यों नहीं दी। क्या कोई वास्तविक मौलिक कारण है या यह सिर्फ "हम इसे अनुमति नहीं देते क्योंकि हम इसे अनुमति नहीं देते हैं"।
जेरेन डेमीयर

15
SyntaxError: non-default argument follows default argument

क्या आप इसकी अनुमति के लिए गए थे, तो डिफ़ॉल्ट तर्क, बेकार गाया किया जाएगा क्योंकि आप कभी नहीं उनके डिफ़ॉल्ट मानों का उपयोग करने में सक्षम हो जाएगा के बाद से गैर-डिफ़ॉल्ट तर्क आ के बाद

हालांकि पायथन 3 में, आप निम्न कार्य कर सकते हैं:

def fun1(a="who is you", b="True", *, x, y):
    pass

जो बनाता है xऔर yकेवल आप ऐसा कर सकते हैं खोजशब्द:

fun1(x=2, y=2)

यह काम करता है क्योंकि अब कोई अस्पष्टता नहीं है। ध्यान दें कि आप अभी भी नहीं कर सकते हैं fun1(2, 2)(जो डिफ़ॉल्ट तर्क सेट करेगा)।


कीवर्ड-केवल तर्क पायथन 3. बहुत खराब की एक साफ सुविधा पैच उन्हें अजगर 2.6 और 2.7 बस गया था backport कर रहे हैं समाप्त करने के लिए छोड़ दिया है
निक चामास

10

मुझे यहां दो बिंदु स्पष्ट करने दें:

  • सबसे पहले गैर-डिफ़ॉल्ट तर्क को डिफ़ॉल्ट तर्क का पालन नहीं करना चाहिए, इसका मतलब है कि आप कार्य में परिभाषित पैरामीटर के क्रम को कार्य में (a = b, c) परिभाषित नहीं कर सकते हैं:
    • स्थितिगत पैरामीटर या गैर-डिफ़ॉल्ट पैरामीटर यानी (ए, बी, सी)
    • कीवर्ड पैरामीटर या डिफ़ॉल्ट पैरामीटर यानी (a = "b", r = "j")
    • कीवर्ड-केवल पैरामीटर अर्थात (* args)
    • var-keyword पैरामीटर अर्थात (** kwargs)

def example(a, b, c=None, r="w" , d=[], *ae, **ab):

(ए, बी) स्थितीय पैरामीटर हैं

(c = none) वैकल्पिक पैरामीटर है

(r = "w") कीवर्ड पैरामीटर है

(d = []) सूची पैरामीटर है

(* ae) केवल कीवर्ड है

(** ab) var-keyword पैरामीटर है

  • अब माध्यमिक बात अगर मैं कुछ इस तरह की कोशिश कर रहा हूँ: def example(a, b, c=a,d=b):

जब डिफ़ॉल्ट मान सहेजे जाते हैं तो तर्क परिभाषित नहीं होता है, जब आप फ़ंक्शन को परिभाषित करते हैं तो पायथन डिफ़ॉल्ट मानों को सहेजता है और सहेजता है

सी और डी परिभाषित नहीं है, मौजूद नहीं है, जब ऐसा होता है (यह केवल तब होता है जब फ़ंक्शन निष्पादित होता है)

"a, a = b" पैरामीटर में इसकी अनुमति नहीं है।


0

आवश्यक तर्क (चूक के बिना), ग्राहक कोड को केवल दो की आपूर्ति करने की अनुमति देने के लिए शुरू में होना चाहिए। यदि वैकल्पिक तर्क शुरू में थे, तो यह भ्रामक होगा:

fun1("who is who", 3, "jack")

आपके पहले उदाहरण में ऐसा क्या होगा? अंतिम में, x "कौन है", y 3 है और a = "जैक" है।

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