पास ** kwargs ** kwargs के साथ एक अन्य फ़ंक्शन के लिए तर्क देते हैं


152

मैं निम्नलिखित उदाहरण को नहीं समझता, कह सकता हूं कि मेरे पास ये कार्य हैं:

# 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 दिए। तो इसके पीछे क्या कारण है?

python 

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

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

जवाबों:


155

दूसरे उदाहरण में आप 3 तर्क प्रदान करते हैं: फ़ाइल नाम, मोड और एक शब्दकोश ( kwargs)। लेकिन पायथन को उम्मीद है: 2 औपचारिक तर्क प्लस कीवर्ड तर्क।

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

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

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

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


5
अब मैं समझ गया। मुझे लगा कि कीवर्ड और तानाशाही एक ही चीज है।

13
"किसी भी शब्दकोश को फ़ंक्शन कॉल के दौरान ** के साथ प्रीफ़िक्स करके कीवर्ड तक विस्तारित किया जा सकता है।" <- Thats cool

1
इन्हें भी देखें: कीवर्ड मापदंडों पर पायथन डॉक्स और तर्क सूची को अनपैक करना
डायनासोर

8
एक वास्तविक कोड उदाहरण इस जवाब को काफी हद तक स्पष्ट कर देगा।
ऑरेंजडॉग

13

**वाक्य रचना एक शब्दकोश में कलेक्ट कीवर्ड तर्कों को अजगर बताता है। save2एक गैर कीवर्ड तर्क (एक शब्दकोश वस्तु) के रूप में यह नीचे से गुजर रहा है। openXकिसी भी कीवर्ड तर्क देख पा रहा है तो **argsआदत हो नहीं करता है। इसके बजाय तीसरा गैर-कीवर्ड तर्क (शब्दकोश) मिल रहा है। इसे ठीक करने के लिए openXफ़ंक्शन की परिभाषा बदलें ।

def openX(filename, mode, kwargs):
    pass

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

@xMRW वे एक ही चीज नहीं हो सकते क्योंकि आप किसी डिक्शनरी के डिक्शनरी के साथ-साथ डिक्शनरी भी पास कर सकते हैं। आपका # 1 तो सही है।
कीथ

8

@Gecco के उत्तर पर विस्तार करते हुए, निम्नलिखित एक उदाहरण है जो आपको अंतर दिखाएगा:

def foo(**kwargs):
    for entry in kwargs.items():
        print("Key: {}, value: {}".format(entry[0], entry[1]))

# call using normal keys:
foo(a=1, b=2, c=3)
# call using an unpacked dictionary:
foo(**{"a": 1, "b":2, "c":3})

# call using a dictionary fails because the function will think you are
# giving it a positional argument
foo({"a": 1, "b": 2, "c": 3})
# this yields the same error as any other positional argument
foo(3)
foo("string")

यहाँ आप देख सकते हैं कि एक शब्दकोश कैसे काम करता है, और वास्तविक शब्दकोश भेजना क्यों विफल हो जाता है


1

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


क्षमा करें, लेकिन "कीवर्ड विस्तार" क्या है? क्या आपका मतलब है कि मुझे ** args के बजाय ताना_वर का उपयोग करना चाहिए और सिर्फ def 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/


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

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