2013-05-16 6 views
6

मान लीजिए कि मेरे पास get_data फ़ंक्शन है जो कुछ कीवर्ड तर्क लेता है। वहाँ किसी तरह मैं इसफ़ंक्शन कॉलिंग और परिभाषा दोनों में ** kwargs का उपयोग करें

def get_data(arg1, **kwargs): 
    print arg1, arg2, arg3, arg4 

arg1 = 1 
data['arg2'] = 2 
data['arg3'] = 3 
data['arg4'] = 4 

get_data(arg1, **data) 

कर सकते हैं तो विचार दोनों समारोह बुला और समारोह परिभाषा तर्क नाम लिखकर से बचने के लिए है। मैं तर्क के रूप में एक शब्दकोश और शब्दकोश की कुंजी के साथ समारोह समारोह के स्थानीय चर फोन हो जाते हैं और उनके मूल्यों को महत्व देता शब्दकोश

मैं ऊपर की कोशिश की और त्रुटि global name 'arg2' is not defined कह मिल गया है। मैं समझता हूं कि वांछित व्यवहार प्राप्त करने के लिए get_data की परिभाषा में मैं locals() को बदल सकता हूं।

तो मेरी कोड इस

def get_data(arg1, kwargs): 
    locals().update(kwargs) 
    print arg1, arg2, arg3, arg4 

arg1 = 1 
data['arg2'] = 2 
data['arg3'] = 3 
data['arg4'] = 4 

get_data(arg1, data) 

की तरह लग रहे थे और यह जाहिर भी काम नहीं होता। locals() का उपयोग किये बिना मैं व्यवहार को भी प्राप्त नहीं कर सकता?

+0

मैं सुझाव है कि आप इस सवाल का http://stackoverflow.com/questions/3394835/args-and-kwargs –

+2

को संशोधित नहीं है की जाँच 'locals' , यह हर समय काम करने की भी गारंटी नहीं देता है: http://docs.python.org/2/library/functions.html#locals – jamylak

+1

.. आप ऐसा क्यों करेंगे? अगर आप arg2, arg3, arg4 हमेशा जानते हैं पारित होने जा रहा है, तो आपको उन्हें व्यक्तिगत तर्क के रूप में निर्दिष्ट करना चाहिए। यदि आप नहीं करते हैं, तो भले ही आपके पास वांछित व्यवहार हो, भले ही आपने संदर्भित किया हो, 'arg4' कहें जब' डेटा 'ने' arg4' को परिभाषित नहीं किया था, यह एक नेमररर उठाएगा। यह किसी भी डेटा को प्रिंट नहीं करेगा, यह सिर्फ एक त्रुटि उठाएगा। – kampu

उत्तर

11

**kwargs एक सादा शब्दकोश है। keyword arguments पर

def get_data(arg1, **kwargs): 
    print arg1, kwargs['arg2'], kwargs['arg3'], kwargs['arg4'] 

इसके अलावा, जांच दस्तावेज़: इस प्रयास करें।

3

अगर हम अपने उदाहरण की जांच:

def get_data(arg1, **kwargs): 
    print arg1, arg2, arg3, arg4 

अपने get_data कार्यों के नाम स्थान में, वहाँ arg1 नामक एक चर रहा है, लेकिन कोई चर arg2 नामित है। इसलिए आप किसी फ़ंक्शन या वेरिएबल तक नहीं पहुंच सकते जो आपके नेमस्पेस में नहीं है।

वास्तव में, आपके नामस्थान में; नामक एक चर arg1 और dictionary ऑब्जेक्ट है। kwargs से पहले नोटेशन का उपयोग करें (नाम kwargs यहां महत्वपूर्ण नहीं है, यह कुछ और भी हो सकता है।) आपके पायथन कंपाइलर को बताता है कि kwargs एक शब्दकोश है और उस शब्दकोश में सभी मानों को आपकी फ़ंक्शन परिभाषा में नामित पैरामीटर के रूप में मूल्यांकन किया जाएगा।

चलें इस उदाहरण पर एक नज़र डालें:

def myFunc(**kwargs): 
    do something 

myFunc(key1='mykey', key2=2) 

जब आप

def myFunc(key1=None, key2=None): 

लेकिन एक अपवाद के साथ की तरह नाम वाले पैरामीटर key1 और key2, अपने कार्य परिभाषा कृत्यों के साथ myFunc कहते हैं! चूंकि myFunc के पास कोई नाम पैरामीटर नहीं है, इसलिए कंपाइलर को यह नहीं पता कि उन्हें सीधे कैसे संभालना है क्योंकि आप अपने फ़ंक्शन में किसी नामित पैरामीटर को पास कर सकते हैं।

तो अपने समारोह एक शब्दकोश के भीतर उन नामित पैरामीटर स्वीकार जैसे आप अपने फ़ंक्शन को कॉल करें:

myFunc({key1:'mykey', key2:2}) 

हां, तो आपके समारोह परिभाषा एक शब्दकोश के भीतर उन मानकों को मिलता है।**kwargs उस बिंदु में अपने शब्दकोश है, जो भी संकलक है कि किसी भी नामित मानकों (** संकेत की मदद से kwargs से पहले) स्वीकार किया जाएगा

def myFunc(**kwargs): 
    print kwargs 

अपने उदाहरण में

{key1:'mykey', key2:2} 

तो प्रिंट होगा बता को परिभाषित करता है , आप एक शब्दकोश की तरह kwargs का उपयोग कर सकते हैं;

def myFunc(**kwargs): 
    kwargs['arg2'] 
    kwargs.get('arg3') 

मुझे आशा है कि यह जटिल नहीं है (:

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