जबकि अधिकांश उत्तर कह रहे हैं कि, जैसे,
def f(**kwargs):
foo = kwargs.pop('foo')
bar = kwargs.pop('bar')
...etc...
के समान है"
def f(foo=None, bar=None, **kwargs):
...etc...
यह सच नहीं है। बाद के मामले में, के f
रूप में कहा जा सकता है f(23, 42)
, जबकि पूर्व का मामला केवल तर्कों को स्वीकार करता है - कोई स्थितिगत कॉल नहीं। अक्सर आप कॉलर को अधिकतम लचीलेपन की अनुमति देना चाहते हैं और इसलिए दूसरा रूप, जैसा कि अधिकांश उत्तर मुखर है, बेहतर है: लेकिन यह हमेशा ऐसा नहीं होता है। जब आप कई वैकल्पिक मापदंडों को स्वीकार करते हैं, जिनमें से आमतौर पर केवल कुछ ही पारित किए जाते हैं, तो यह एक उत्कृष्ट विचार हो सकता है (नाम कॉल में दुर्घटनाओं और अपठनीय कोड से बचना!) नामित तर्कों के उपयोग के लिए मजबूर करना - threading.Thread
एक उदाहरण है। पहला रूप यह है कि आप इसे पायथन 2 में कैसे लागू करते हैं।
मुहावरा इतना महत्वपूर्ण है कि पायथन 3 में अब विशेष सहायक वाक्यविन्यास है: हस्ताक्षर *
में एक के बाद प्रत्येक तर्क def
केवल कीवर्ड है, अर्थात, इसे एक स्थैतिक तर्क के रूप में पारित नहीं किया जा सकता है, लेकिन केवल एक नाम के रूप में। तो पायथन 3 में आप उपरोक्त कोड दे सकते हैं:
def f(*, foo=None, bar=None, **kwargs):
...etc...
वास्तव में, पायथन 3 में आप कीवर्ड-केवल तर्क भी दे सकते हैं जो वैकल्पिक नहीं हैं (डिफ़ॉल्ट मान के बिना)।
हालांकि, पायथन 2 में अभी भी लंबे समय से उत्पादक जीवन है, इसलिए बेहतर है कि आप उन तकनीकों और मुहावरों को न भूलें जो आपको पायथन 2 के महत्वपूर्ण डिजाइन विचारों पर लागू करते हैं जो सीधे पायथन 3 में भाषा में समर्थित हैं!