我遇到以下情况:我希望将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
而不参考所需的参数?我该如何概括呢?
答案 0 :(得分:1)
最好的方法是让调用保持不变
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())
这在Python 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 :(得分:1)
这是您的代码,根据我提到的副本进行更新。
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