使用三元运算符的可选参数

时间:2016-07-12 14:42:52

标签: python arguments optional ternary-operator

我有一个函数f可能需要可变数量的参数,如下所示:

f = f_5_args if five else f_4_args

要致电f,我目前正在这样做:

if five:
  result = f(x1, x2, x3, x4, x5)
else:
  result = f(x1, x2, x3, x4)

有没有更好的方法来调用f,那也会使用三元运算符或类似的东西?在像Lua这样的其他语言中,我可以做类似的事情:

result = f(x1, x2, x3, x4, x5 if five else None)

但我在python中找不到相同的东西。

编辑:我当然可以这样做:

result = f(x1, x2, x3, x4, x5) if five else f(x1, x2, x3, x4)

但在我的情况下,x_i是一些相对较长的表达式,所以我宁愿不写两次。我可以将它们存储在一些变量中并执行此操作,但我想知道是否有更好的方法。

3 个答案:

答案 0 :(得分:2)

如果您有参数列表,可以使用切片使其更简洁:

args = [x1, x2, x3, x4, x5]
result = f(*args) if five else f(*args[:4])

但是使用一个接受任意数量位置参数的函数可能会更容易:

def f45(*args):
    if len(args) == 5:
         # do something
    elif len(args) == 4:
         # do something else

答案 1 :(得分:0)

您可以执行以下操作:

result = f(*(filter(None, (x1, x2, x3, x4, x5 if five else None))))

请注意,此解决方案会将所有False和零值与None一起消除,因此如果它适合您的用例,请使用它。

答案 2 :(得分:0)

你可以这样做:

fargs = [x1, x2, x3, x4]
if five:
    fargs.append(x5)
    result = f_5_args(*fargs)
else:
    result = f_4_args(*fargs)

这避免了必须两次写出所有函数参数。