38

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

value = foo if something else bar

我的问题很简单:在没有事先分配的情况下,是否可以if ...从返回操作数之一(... ifelse ...)中引用()中评估的术语?

这里的动机是,有时我使用的表达式if ...正是我想要的三元运算结果;虽然发生这种情况,对于小的表达式,重复它没有问题,但是对于更长的表达式,它会变得有些讨厌。以此为例:

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

2 回答 2

44

没有办法做到这一点,这是故意的。三元 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 都不鼓励这样做。

如果你只这样做一次,最好更明确一点。如果你这样做了六次,就像所有那些内置和 stdlib 函数一样,findNext使用可选的默认值 return 而不是更好:None

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")
于 2012-12-31T20:01:17.903 回答
22

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

value = info.findNext("b") or "Oompa Loompa"
于 2012-12-31T19:46:15.017 回答