是否存在v ??? d
v
与v
不同并且不评估None
或,则d
如果d
等于v
,则None
。(其中???
我表示我正在寻找的运营商。
运算符or
几乎就是我想要的,但如果v
为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
,则返回。否则第二个是evalauted(并且仅在这种情况下),它将是表达式的结果。
答案 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 manual或some other instructions。
答案 1 :(得分:0)
尝试使用v if v is not None else d