वैकल्पिक तर्क के साथ मैं पायथन फ़ंक्शन कैसे बनाऊं?


218

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

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

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

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

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

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

अभी ctypes का उपयोग करने वाला प्रोटोटाइप कुछ इस तरह दिखता है:

_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]

जवाबों:


195

जैसे कि यह कॉल करके देखें: obj.some_function( '1', 2, '3', g="foo", h="bar" )। आवश्यक स्थिति संबंधी तर्कों के बाद, आप नाम से विशिष्ट वैकल्पिक तर्क निर्दिष्ट कर सकते हैं।


246

बस *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


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


@ निक्स, मुझे वास्तव में आपका उत्तर पसंद है। हालाँकि, क्या आप कृपया स्पष्ट कर सकते हैं कि कथन किसके लिए c = kwargs.get('c', None)प्रयोग किया जाता है? क्या यह उन सभी कार्यों में आवश्यक है जिनके पास वैकल्पिक args है? आपके कोड में, आपके पास केवल 2 वैकल्पिक args थे। क्या होगा यदि उपयोगकर्ता एक और arg कहना चाहता है e? मैं किसी भी अज्ञात संख्या के लिए अपने नमूना कोड को कैसे बदल सकता हूँ, उदाहरण के लिए def my_func(a, b, *args, **kwagars): obj = <do something with a & b> obj.add(c) obj.add(d) continue obj.add(for e, f, g...):? क्या मुझे ऐसा करने c = kwargs.get('c', None) etcसे पहले शामिल करना होगा obj.add(c, d, ...)?
निमो

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