मेरे पास निम्न स्थिति है: मेरे पास एक एकल master_function है जिसमें मैं एक sub_function पास करना चाहता हूं। इस परिवर्तन में मैं जिस फ़ंक्शन को पास करना चाहता हूं (उदाहरण के लिए 1 और 2)। प्रत्येक फ़ंक्शन के तर्क भी उनकी संख्या और प्रकार में भिन्न होते हैं।

def sub_function_1( x, y, z):
   return x + y + z

def sub_function_2( x, y ):
   return x + y 

def master_function( x, y, z, F ): 
   return x*y + F()

त्वरित समाधान

इसका सरल समाधान सभी संभावित तर्कों के साथ फ़ंक्शन कॉलबैक लिखना होगा, चाहे उनका उपयोग किया जाए या नहीं:

   def master_function( x, y, z, F ): 
       return x*y + F(x,y,z)

तब हम master_function( x, y, z, sub_function_1) या master_function( x, y, z, sub_function_2) को इच्छानुसार कॉल कर सकते हैं।

दुर्भाग्य से, मेरे पास कई कार्य हैं जिन्हें मैं मास्टर फ़ंक्शन में पास करना चाहता हूं; तो यह दृष्टिकोण उपयुक्त नहीं है!

क्या आवश्यक तर्कों के संदर्भ के बिना F को master_function में लिखने का कोई तरीका है? मैं इसे कैसे सामान्यीकृत कर सकता हूं?

1
AngusTheMan 27 अप्रैल 2018, 19:14

2 जवाब

सबसे बढ़िया उत्तर

सबसे अच्छा तरीका यह होगा कि कॉल्स को स्थिर रखा जाए

def sub_function_1( x, y, z):
    return x + y + z

def sub_function_2( x, y, z ):
    return x + y 

def master_function( x, y, z, F ): 
    return x * y + F(x,y,z) 

लेकिन यदि आप चाहें तो इसे और अधिक गतिशील बना सकते हैं:

def sub_function_1( x, y, z, **kwargs):
    return x + y + z

def sub_function_2( x, y, **kwargs ):
    return x + y 

def master_function( x, y, z, F ): 
    return x * y + F(**locals())

यह पायथन 3 क्षमता में बेहतर काम करता है:

def sub_function_1(*args):
    return args[0] + args[1] + args[2]

def sub_function_2(*args):
    return args[0] + args[1] 

def master_function(*args, F): 
    return args[0] * args[1] + F(*args) 
.
.
.
>>> master_function(1,2,3,F=sub_function_1)
8
>>> master_function(1,2,3,F=sub_function_2)
5
>>> master_function(1,2,F=sub_function_2)
5
>>> master_function(1,2,F=sub_function_1)
IndexError: tuple index out of range
1
cdhagmann 27 अप्रैल 2018, 19:43

यहां आपका कोड है, मेरे द्वारा बताए गए डुप्लिकेट के अनुसार अपडेट किया गया।

def sub_function_1( x, y, z):
   return x + y + z

def sub_function_2( x, y ):
   return x + y 

def master_function(*args):
   F = args[-1]
   F_args = args[:-1]
   x = args[0]
   y = args[1]

   return x*y + F(*F_args)

print(master_function(1, 2, 3, sub_function_1))
print(master_function(-10, -20, sub_function_2))

आउटपुट:

8
170
1
Prune 27 अप्रैल 2018, 19:38