在Python中压缩`x if x else y`语句

Rub*_*ens 25 python ternary-operator variable-assignment user-friendly

我非常熟悉Python的三元运算符方法:

value = foo if something else bar
Run Code Online (Sandbox Code Playgroud)

我的问题很简单:没有先前的赋值,无论如何都要if ...从一个返回操作数(... ifelse ...)中引用()中被评估的术语?

这里的动机是,有时我使用的表达式if ...正是我想要的三元运算结果; 虽然如此,对于小表达式,重复它没有问题,但对于更长的表达式,它有点令人讨厌.以此为例:

value = info.findNext("b") if info.findNext("b") else "Oompa Loompa"
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 30

没有办法做到这一点,这是故意的.三元if只能用于琐碎的案例.

如果要使用计算结果两次,请将其放在临时变量中:

value = info.findNext("b")
value = value if value else "Oompa Loompa"
Run Code Online (Sandbox Code Playgroud)

一旦你这样做,很明显你正在做一些愚蠢的事情,实际上写这个的pythonic方式是:

value = info.findNext("b")
if not value:
    value = "Oompa Loompa"
Run Code Online (Sandbox Code Playgroud)

而这实际上比原来的尝试少了 5 击键.

如果你真的想保存击键,你可以这样做:

value = info.findNext("b") or "Oompa Loompa"
Run Code Online (Sandbox Code Playgroud)

但是,许多风格指南和BDFL都对此感到沮丧.

如果你只是这样做一次,最好更明确一点.如果你正在进行六次,那么findNext将一个可选的默认值返回而不是None像所有内置和stdlib函数一样,这是微不足道的 - 而且要好得多 - :

def findNext(self, needle, defvalue=None):
    # same code as before, but instead of return None or falling off the end,
    # just return defvalue.
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

value = info.findNext("b", "Oompa Loompa")
Run Code Online (Sandbox Code Playgroud)


Ign*_*ams 21

完全不要使用if ... else.相反,利用Python的合并运算符.

value = info.findNext("b") or "Oompa Loompa"
Run Code Online (Sandbox Code Playgroud)

  • 它[当然是一个快捷方式](http://docs.python.org/2/library/stdtypes.html#boolean-operations-and-or-not),@Rubens。`x or y` 应该编译成与 `if bool(x) then x else y` 相同的代码。`bool` 调用 `.__nonzero__()`。 (2认同)
  • 您_可以_这样做,但这并不意味着您_应该_。如果您执行此操作的次数足够多,以至于节省 5 次击键很重要,请修改“findNext”方法以采用默认值。否则,请明确写出。 (2认同)