我非常熟悉Python的三元运算符方法:
value = foo if something else bar
我的问题非常简单:如果没有先前的分配,是否仍然可以从其中一个返回操作数(if ...
或... if
)引用正在评估的术语(else ...
)?
这里的动机是有时候我在if ...
中使用的表达式正是我希望在三元运算中得到的结果;虽然如此,对于小表达式,重复它没有问题,但对于更长的表达式,它有点令人讨厌。以此为例:
value = info.findNext("b") if info.findNext("b") else "Oompa Loompa"
答案 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"