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

时间:2012-12-31 19:44:02

标签: python variable-assignment ternary-operator user-friendly

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

value = foo if something else bar

我的问题非常简单:如果没有先前的分配,是否仍然可以从其中一个返回操作数(if ...... if)引用正在评估的术语(else ...)?

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

value = info.findNext("b") if info.findNext("b") else "Oompa Loompa"

2 个答案:

答案 0 :(得分:29)

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

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

value = info.findNext("b")
value = value if value else "Oompa Loompa"

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

value = info.findNext("b")
if not value:
    value = "Oompa Loompa"

实际上,与原始尝试相比,实际上只有5次次击键。

如果确实想要保存击键,您可以改为:

value = info.findNext("b") or "Oompa Loompa"

但许多风格指南和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.

然后你可以这样做:

value = info.findNext("b", "Oompa Loompa")

答案 1 :(得分:21)

根本不要使用if ... else。相反,利用Python的合并运算符。

value = info.findNext("b") or "Oompa Loompa"