2012-03-26 17 views
82

मैं निम्न उदाहरण समझ में नहीं आता के साथ एक और कार्य करने के लिए तर्क kwargs, मान लीजिए कि मैं इन कार्यों:पास ** ** kwargs

# python likes 
def save(filename, data, **kwargs): 
    fo = openX(filename, "w", **kwargs) # <- #1 
    fo.write(data) 
    fo.close() 
# python doesnt like 
def save2(filename, data, **kwargs): 
    fo = openX(filename, "w", kwargs) # <- #2 
    fo.write(data) 
    fo.close() 

def openX(filename, mode, **kwargs): 
    #doing something fancy and returning a file object 

# 1 सही समाधान और # 2 गलत एक क्यों है ? **kwargs मूल रूप से एक निर्देश है, इसलिए यदि मैं ओपनएक्स को तर्क पारित करना चाहता हूं तो मुझे लगता है कि सही तरीका ** के बिना होगा और केवल निर्देश दे रहा है। लेकिन पाइथन स्पष्ट रूप से दूसरे की तरह नहीं है और मुझे बताता है कि मैंने 2 तर्कों के बजाय 3 दिया। तो इसके पीछे क्या कारण है?

+3

मुझे आश्चर्य है कि आप इसे कोड में '** args' क्यों कहते हैं। यह संभवतः सबसे खराब संभव नाम है क्योंकि लोग इसे '* args' –

+1

' के साथ भ्रमित करेंगे, ठीक है, मैं वास्तव में कभी भी * args का उपयोग नहीं करता, इसलिए मैं ** args ^^ का उपयोग करता हूं, लेकिन अच्छी तरह से मैं इसे संशोधित कर सकता हूं। –

उत्तर

84

दूसरे उदाहरण में आप 3 तर्क प्रदान करते हैं। लेकिन पायथन उम्मीद करता है: 2 औपचारिक तर्क और कीवर्ड तर्क।

'**' द्वारा शब्दकोश को उपसर्ग करके आप कीवर्ड तर्कों के लिए kwargs शब्दकोश को अनपैक करते हैं।

एक शब्दकोश (प्रकार dict) एक एकल चर है जिसमें कुंजी-मूल्य जोड़े हैं।

"कीवर्ड तर्क" कुंजी-मूल्य विधि-पैरामीटर हैं।

कोई भी शब्दकोश फ़ंक्शन कॉल के दौरान ** के साथ उपसर्ग करके कीवर्ड तर्कों को अनपॅक करके कर सकता है।

+3

अब मुझे मिल गया। मैंने सोचा कि कीवर्ड और dict एक ही बात थी। –

+7

"कोई भी शब्दकोश फ़ंक्शन कॉल के दौरान ** के साथ उपसर्ग करके कीवर्ड में विस्तारित कर सकता है।" <- यह ठंडा –

+1

यह भी देखें: [कीवर्ड पैरामीटर] पर पाइथन दस्तावेज़ (https://docs.python.org/2/tutorial/controlflow.html#keyword-arguments) और [अनपॅकिंग तर्क सूचियां] (https: // docs .python.org/2/ट्यूटोरियल/controlflow.html # अनपॅकिंग-तर्क-सूचियां) – dinosaur

1

क्योंकि एक शब्दकोश एक एकल मूल्य है। यदि आप कीवर्ड तर्कों के समूह के रूप में इसे पास करना चाहते हैं तो आपको कीवर्ड विस्तार का उपयोग करने की आवश्यकता है।

+0

क्षमा करें लेकिन "कीवर्ड विस्तार" क्या है? क्या आपका मतलब है कि मुझे ** args के बजाय dict_var का उपयोग करना चाहिए और केवल डीफ़ func (तर्क, dict_var = 0) का उपयोग करना चाहिए ... func (1, {1: "a", 2: "b"}) –

1

# 2 तर्कों के लिए केवल औपचारिक पैरामीटर होगा, लेकिन एक कीवर्ड प्रकार पैरामीटर नहीं होगा।

यदि आप एक कीवर्ड तर्क आप अपने शब्दकोश है, जो ** आर्ग

इस चेक kw

का उपयोग कर ** बारे में अधिक विस्तार के लिए बाहर का मतलब है पहले विशिष्ट ** की जरूरत में एक कीवर्ड प्रकार पैरामीटर पास करना चाहते हैं

http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/

+0

तो एक है ** kwargs और dict के बीच बड़ा अंतर? –

+0

@xMRW अपडेट उत्तर आशा आपकी मदद –

+0

धन्यवाद, मैं हमेशा उन विषयों के बारे में अधिक पढ़ना पसंद करता हूं जिन्हें मैं समझ नहीं पा रहा हूं। –

8

** सिंटैक्स पाइथन को एक शब्दकोष में कीवर्ड तर्क एकत्र करने के लिए कहता है। save2 इसे गैर-कीवर्ड तर्क (एक शब्दकोश ऑब्जेक्ट) के रूप में पास कर रहा है। openX कोई भी कीवर्ड तर्क नहीं देख रहा है, इसलिए **args उपयोग नहीं किया जाता है। यह एक तीसरा गैर-कीवर्ड तर्क (शब्दकोश) प्राप्त करने के बजाय है। उस परिवर्तन को ठीक करने के लिए openX फ़ंक्शन की परिभाषा। फ़ाइल नाम, मोड और एक शब्दकोश (kwargs):

def openX(filename, mode, kwargs): 
    pass 
+0

धन्यवाद, लेकिन मैं बिना सहेजे ओपनएक्स का उपयोग करना चाहता हूं, इसलिए मुझे कीवर्ड से चिपकना होगा। मैंने सोचा था कि खोजशब्दों को गुजरना मूल रूप से एक नियम को पार करने जैसा ही था, लेकिन मुझे अब तक नहीं पता था :) –

+0

@xMRW \t वे एक ही चीज़ नहीं हो सकते हैं क्योंकि आप किसी भी फ़ंक्शन के पैरामीटर के रूप में शब्दकोश को पास कर सकते हैं कुंआ। आपका # 1 तब सही है। – Keith

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