【问题标题】:optional argument with ternary operator三元运算符的可选参数
【发布时间】:2016-07-12 14:42:51
【问题描述】:

我有一个函数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 是一些相对较长的表达式,所以我不想写两次。我可以将它们存储在一些变量中并执行此操作,但我想知道是否有更好的方法。

【问题讨论】:

  • f_5_argsf_4_args 是什么?
  • 它们是 2 个函数,分别(并且严格地)接受 5 个和 4 个参数。

标签: python arguments optional ternary-operator


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你可以这样做:

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

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

    【讨论】:

      【解决方案3】:

      您可以执行以下操作:

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

      请注意,此解决方案会消除所有 False 和零值以及 Nones,因此如果适合您的用例,请使用它。

      【讨论】:

      • 如果某个参数x 具有虚假值怎么办?
      • 是的,我的解决方案消除了所有 False 和零值以及 Nones。
      • 这显然不是将参数传递给函数的pythonic方式
      猜你喜欢
      • 2021-10-06
      • 1970-01-01
      • 2021-06-25
      • 2015-09-29
      • 1970-01-01
      • 2016-07-02
      • 2015-02-04
      • 1970-01-01
      • 2012-04-02
      相关资源
      最近更新 更多