调用具有未知数量参数的函数

时间:2015-03-12 13:39:50

标签: python args

我正在尝试在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参数。

但这不会那么容易。我的方式是"适当的"解决问题的方法还是存在更好的方法?

2 个答案:

答案 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

或者您可以将公共部分移动到调度程序