2012-03-02 13 views
63

मेरे पास एक पायथन फ़ंक्शन है जो कई तर्क लेता है। इनमें से कुछ तर्क कुछ परिदृश्यों में छोड़े जा सकते हैं।वैकल्पिक तर्कों के साथ मैं पाइथन फ़ंक्शन कैसे बना सकता हूं?

def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None): 
    #code 

तर्क dh के माध्यम से तार प्रत्येक अलग-अलग अर्थ है जो कर रहे हैं। यह महत्वपूर्ण है कि मैं चुन सकता हूं कि किसी भी संयोजन में कौन से वैकल्पिक पैरामीटर पास किए जाएंगे। उदाहरण के लिए, (a, b, C, d, e), या (a, b, C, g, h), या (a, b, C, d, e, f, या उनमें से सभी (ये मेरे विकल्प हैं)।

यह बहुत अच्छा होगा यदि मैं समारोह ओवरलोड सकता है हो सकता है - लेकिन मैंने पढ़ा है कि अजगर से अधिक भार का समर्थन नहीं करता। मैंने सूची में कुछ आवश्यक int तर्क डालने का प्रयास किया - और एक तर्क विसंगति त्रुटि मिली।

अभी मैं पहले कुछ लापता तर्कों के स्थान पर प्लेसहोल्डर के रूप में खाली तार भेज रहा हूं। मैं केवल वास्तविक मानों का उपयोग करके एक फ़ंक्शन को कॉल करने में सक्षम होना चाहता हूं।

क्या ऐसा करने का कोई तरीका है? क्या मैं तर्क सूची के बजाय एक सूची पास कर सकता हूं?

_fdll.some_function.argtypes = [c_void_p, c_char_p, c_int, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p] 
+0

संबंधित महत्वपूर्ण महत्वपूर्ण हैं का एक शब्दकोश के लिए होता है: [** क्या करता है (डबल स्टार/तारांकन) और * (स्टार/तारांकन) मापदंडों के लिए करते हैं ?] (https://stackoverflow.com/q/36901/3357935) –

उत्तर

74

इसे पसंद कॉल करके देखें: obj.some_function('1', 2, '3', g="foo", h="bar")

अभी ctypes का उपयोग कर प्रोटोटाइप की तरह कुछ लग रहा है। आवश्यक स्थितित्मक तर्कों के बाद, आप नाम से विशिष्ट वैकल्पिक तर्क निर्दिष्ट कर सकते हैं।

94

बस * args पैरामीटर का उपयोग करें, जो आपको a,b,c के बाद जितना चाहें उतने तर्कों को पारित करने की अनुमति देता है। आपको args-> c, d, e, f मानचित्र करने के लिए कुछ तर्क जोड़ना होगा, लेकिन यह ओवरलोडिंग का "तरीका" है।

def myfunc(a,b, *args, **kwargs): 
    for ar in args: 
     print ar 
myfunc(a,b,c,d,e,f) 

और यह c,d,e,f


इसी तरह आप kwargs तर्क इस्तेमाल कर सकते हैं और फिर आप अपने मानकों को नाम दे सकते हैं प्रिंट होगा।

def myfunc(a,b, *args, **kwargs): 
     c = kwargs.get('c', None) 
     d = kwargs.get('d', None) 
     #etc 
myfunc(a,b, c='nick', d='dog', ...) 

और फिर kwargs सभी मापदंडों उसके बाद a,b

+0

धन्यवाद। जबकि मैं अपने कोड में इस लचीलेपन का उपयोग नहीं कर सकता, और यह मेरी सूची में विभिन्न खाली छेदों के साथ कॉल करने की मेरी समस्या का समाधान नहीं करता है, यह एक अलग परियोजना में उपयोग करने के लिए एक शानदार उपकरण है। और रसेल बोरोगोव ने मुझे अपनी समस्या के लिए आवश्यक सटीक उत्तर दिया, मैं खुश हूं। – Thalia

+5

इसे [मनमानी तर्क सूची] कहा जाता है (http://docs.python.org/tutorial/controlflow.html#arbitrary-argument-lists) – FabienB