我正在尝试在python中创建一组函数,它们将对一组输入执行类似的操作。所有函数都有一个输入参数固定,其中一半还需要第二个参数。为简单起见,下面是一个只有两个功能的玩具示例。
现在,我希望在我的脚本中运行相应的功能,具体取决于用户输入的数字。这里,用户是随机函数(因此最小的例子有效)。我想做的是这样的事情:
def function_1(*args):
return args[0]
def function_2(*args):
return args[0] * args[1]
x = 10
y = 20
i = random.randint(1,2)
f = function_1 if i==1 else function_2
return_value = f(x,y)
它有效,但对我来说似乎很混乱。我宁愿将function_1
定义为
def function_1(x):
return x
另一种方法是定义
def function_1(x,y):
return x
但是这给我留下了一个悬空的y
参数。
但这不会那么容易。我的方式是"适当的"解决问题的方法还是存在更好的方法?
答案 0 :(得分:2)
您可能还有一个带有可选第二个参数的函数:
def function_1(x, y = None):
if y != None:
return x + y
else:
return x
以下是示例运行:
>>> function_1(3)
3
>>> function_1(3, 4)
7
甚至可选多个参数!看看这个:
def function_2(x, *args):
return x + sum(args)
示例运行:
>>> function_2(3)
3
>>> function_2(3, 4)
7
>>> function_2(3, 4, 5, 6, 7)
25
您可以在此处参考args
列出:
def function_3(x, *args):
if len(args) < 1:
return x
else:
return x + sum(args)
示例运行:
>>> function_3(1,2,3,4,5)
15
答案 1 :(得分:2)
这里有几种方法,所有方法都添加了更多的样板代码。
还有这个PEP可能对您有用。
但是&#39; pythonic&#39;这样做的方式并不像通常的函数重载一样优雅,因为函数只是类属性。
所以你可以选择这样的功能:
def foo(*args):
然后计算你有多少args
,这将是非常广泛但非常灵活。
另一种方法是默认参数:
def foo(first, second=None, third=None)
灵活性较差但更易于预测,最后您还可以使用:
def foo(anything)
并检测函数中anything
的类型。
你的猴子修补示例也可以工作,但是如果你将它与类方法一起使用会变得更加复杂,而且内省也很棘手。
编辑:此外,对于您的情况,您可能希望将功能分开并编写单个“调度员”。根据参数调用适当函数的函数,这可能是上面考虑的最佳解决方案。
EDIT2:根据您的意见我相信以下方法可能适合您
def weigh_dispatcher(*args, **kwargs):
#decide which function to call base on args
if 'somethingspecial' in kwargs:
return weight2(*args, **kwargs)
def weight_prep(arg):
#common part here
def weight1(arg1, arg2):
weitht_prep(arg1)
#rest of the func
def weight2(arg1, arg2, arg3):
weitht_prep(arg1)
#rest of the func
或者您可以将公共部分移动到调度程序