2013-07-31 69 views
1

是否有操作員或庫函數,使得v ??? d如何提供默認值iff值爲None?

  • 評估爲v如果v是從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,則返回。否則,第二個被疏散(只在這種情況下),這將是表達式的結果。

+0

如果v = d,你想要做什麼?這種情況沒有預料,對吧? – Jblasco

+0

@Jblasco它並不重要。如果'v'是'None',我只需要評估'd',所以我們不能比較這些值來決定什麼。 –

+0

對不起,但它很重要。如果你想v = d當且僅當v = None時,如果從v = d開始,你需要給v另一個值。只有當v永遠不會從一開始,這個討論並不重要。 – Jblasco

回答

5

有沒有這樣的運營商,但它使用三元如果「操作」

v if v is not None else d 

如果v是一個昂貴的函數調用,您可以使用任何類型的caching (aka memoization)仍然使用相同的方法straigtforward反正:

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

computeSomethingLong() if computeSomethingLong() else computeSomethingElse() 

仍然會評估computeSomethingLong一次

請參閱python manualsome other instructions瞭解裝飾細節。

+0

謝謝,這是迄今爲止最接近的想法。問題在於如果'computeSomethingLong'具有(期望的)副作用。例如,如果它讀取並分析來自網絡套接字的值。 –

+0

比你有一些理由要將程序流程重寫爲(1)從函數中刪除副作用或(2)明確調用它一次。無論如何,你正在嘗試做一些非常古怪的事情:) – J0HN

0

試用v if v is not None else d

相關問題