代码之家  ›  专栏  ›  技术社区  ›  le4m

在不同条件下,在一行中接收不同数量的返回值

  •  0
  • le4m  · 技术社区  · 7 年前

    假设我有一个函数,在不同的条件下返回不同数量的输出;例如

    def _fn(cond):
        ....
        if cond is 'A':
            return x, y
        else:
            return y
    

    以及一种获得 _fn 详情如下:

    if cond is 'A':
        x_out, y_out = _fn(cond)
    else:
        y_out = _fn(cond)
    

    我的问题是,我能把右上方的四行减为一行吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   flazzarini    7 年前

    可以使用python 2.5版中添加的三元表示法。你可以阅读更多关于这些的内容 here

    首先 condition 然后返回if或else结果。所以你可以像这样重写你的函数。

    def fun(cond, x, y):
        return (x, y) if cond == 'A' else y
    

    然而,正如我在评论中已经提到的,我建议不要从一个函数返回多种不同类型的结果。要么总是返回 tuple 或者返回一个值。

        2
  •  -1
  •   FHTMitchell    7 年前

    我认为最好的方法是返回一个包含 None

    def wrap_fn(cond):
       res = _fn(cond)
       if cond == 'A':  # or test isinstance(res, tuple)
           return res
       return None, res
    

    用作

    x_out, y_out = wrap_fn(cond)
    
    # then do your code
    if x_out is None:
       ...
    else:
       ...
    

    你可以在一行中完成

    x_out, y_out = (None, _fn(cond)) if cond == 'A' else _fn(cond)
    

    但这很混乱。

    不过,我同意这些评论,如果这是经常发生的事情,那么你的逻辑可能有问题。函数应该返回一致的类型(尤其是不返回不一致的类型,具体取决于 价值 (输入的数量)。