2012-05-08 9 views
10

ऐसा लगता है कि पाइथन के कई पहलू सिर्फ कार्यक्षमता के डुप्लिकेट हैं। क्या मैं पावरॉन के भीतर kwargs और dict में देख रहे अनावश्यकता से परे कुछ अंतर है?पायथन 3.2 में ** kwargs और dict के बीच क्या अंतर है?

+4

'** kwargs' परोक्ष बनाता है * एक *' dict' वस्तु (चाबियाँ और मूल्यों के साथ लोड 'kwargs' द्वारा नामित)। यह एक डुप्लिकेट कार्यक्षमता नहीं है। –

+0

"कई पहलुओं" पर विस्तार करें। डुप्लिकेट कार्यक्षमता क्या अन्य क्षेत्र हैं? – jdi

उत्तर

8

तर्क में एक फर्क खोल (कई लोगों kwargs का उपयोग जहां) और dict गुजर तर्क के रूप में है:

  • तर्क unpacking का उपयोग करना:

    # Prepare function 
    def test(**kwargs): 
        return kwargs 
    
    # Invoke function 
    >>> test(a=10, b=20) 
    {'a':10,'b':20} 
    
  • के रूप में एक dict पासिंग एक तर्क:

    # Prepare function 
    def test(my_dict): 
        return my_dict 
    
    # Invoke function 
    >>> test(dict(a=10, b=20)) 
    {'a':10,'b':20} 
    

मतभेद ज्यादातर हैं:

  • पठनीयता (आप बस कीवर्ड तर्क पारित कर सकते हैं, भले ही वे स्पष्ट रूप से परिभाषित नहीं कर रहे थे),
  • लचीलापन (आप कुछ कीवर्ड तर्क स्पष्ट रूप से समर्थन कर सकते हैं और बाकी **kwargs का प्रयोग करके) ,
  • तर्क unpacking, आप वस्तु "युक्त" तर्कों (जो कम महत्वपूर्ण है, सामान्य रूप में अजगर के रूप में मान लिया गया डेवलपर्स जानते हैं कि वे क्या कर रहे हैं, जो एक अलग विषय है) के लिए अप्रत्याशित परिवर्तन से बचने में मदद करता है
+4

अनपॅकिंग के साथ, कुंजियों को वैध पहचानकर्ता होने की आवश्यकता है –

+0

@gnibbler: आप सही हैं, +1। मैं पूरी तरह से याद किया। एक उदाहरण के रूप में मैं 'टेस्ट ({0: 10,' 0 ': 20})' (जो '{0: 10, '0': 20}') वापस कर देगा, तर्क को अनपॅकिंग के साथ प्रतिस्थापित करना मुश्किल है। – Tadeck

3

यह सही है कि ज्यादातर मामलों में आप केवल डिक्ट्स और ** kwargs का आदान-प्रदान कर सकते हैं।

उदाहरण के लिए:

my_dict = {'a': 5, 'b': 6} 
def printer1(adict): 
    return adict 
def printer2(**kwargs): 
    return kwargs 

#evaluate: 
>>> printer1(my_dict) 
{'a': 5, 'b': 6} 
>>> printer2(**my_dict) 
{'a': 5, 'b': 6} 
kwargs आप और अधिक लचीलापन यदि आप इसे अन्य तर्कों के साथ गठबंधन के साथ

हालांकि:

def printer3(a, b=0, **kwargs): 
    return a,b,kwargs 

#evaluate 
>>> printer3(**my_dict) 
(5, 6, {}) 
संबंधित मुद्दे