如果值为None,如何提供默认值?

时间:2013-07-31 08:49:37

标签: python functional-programming maybe

是否存在v ??? d

的运算符或库函数
    如果vv不同并且不评估None或,则
  • 评估为d 如果d等于v,则
  • 评估为None

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

运算符or几乎就是我想要的,但如果vFalse,它会计算为默认值。我希望仅在参数为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,则返回。否则第二个是evalauted(并且仅在这种情况下),它将是表达式的结果。

2 个答案:

答案 0 :(得分:5)

没有这样的操作员,但无论如何使用三元如果“操作员”

它是直截了当的
v if v is not None else d

如果v是一项昂贵的函数调用,您可以使用任何类型的caching (aka memoization)来使用相同的方法:

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

computeSomethingLong() if computeSomethingLong() else computeSomethingElse()

仍会评估computeSomethingLong 一次

有关装饰器的详细信息,请参阅python manualsome other instructions

答案 1 :(得分:0)

尝试使用v if v is not None else d