1

是否有运算符或库函数这样v ??? d

  • 评估为vifv不同于None且不评估d, 或
  • 计算为difv等于None

(其中???我表示我正在寻找的运营商)。

运算符or几乎是我想要的,但它的计算结果为默认值 if vis False。仅当参数为 时,我才需要默认值None,因此False ??? d计算结果为False


更新:为了澄清,在我的情况下v可以是一个复杂的表达式,比如computeSomethingLong() ??? d. 所以我不能使用

computeSomethingLong() if computeSomethingLong() is not None else d

我必须做类似的事情

tempvar = computeSomethingLong()
tempvar if tempvar is not None else d

相比之下,感觉很尴尬computeSomethingLong() or d


更新:我得到的最接近的是定义我自己的函数:

def orElse(v, deflt):
    if v is not None:
        v
    else:
        deflt

但缺点是deflt总是被评估!我希望它在实际需要时进行评估。特别是,我希望在

firstLongComputation() ??? secondLongComputation()

评估第一个计算;如果结果不是None,则返回。否则,第二个将被评估(并且仅在这种情况下),它将是表达式的结果。

4

2 回答 2

5

没有这样的运算符,但无论如何使用三元 if “运算符”

v if v is not None else d

如果v是一个昂贵的函数调用,您可以使用任何类型的缓存(也称为 memoization)来仍然使用相同的方法:

@memoize
def computeSomethingLong():
   """whatever"""

computeSomethingLong() if computeSomethingLong() else computeSomethingElse()

还是会评价computeSomethingLong 一次

有关装饰器的详细信息,请参阅python 手册其他一些说明

于 2013-07-31T08:54:59.787 回答
0

尝试v if v is not None else d

于 2013-07-31T08:56:37.257 回答