2011-10-26 79 views

回答

9

我們沒有這些之一,但它並不難自己推出:

def andand(x, func): 
    return func(x) if x else None 

>>> x = '10.25' 
>>> andand(x, float) 
10.25 
>>> x = None 
>>> andand(x, float) is None 
True 
+3

模仿Ruby的andand:return(func(x)if(x不是None)else None)。也許可以發送可選的額外參數:def andand(x,func,* args,** kwargs) – tokland

+0

我喜歡它,托克蘭的建議,它簡潔而強大。 –

4

起飛雷蒙德的想法,這裏有一個製作這種條件包裝的工廠。爲什麼在你可以讓Python爲你寫'em'時自己寫'他們?

def makeandand(func): 
    return lambda x: func(x) if x else None 

andandfloat = makeandand(float) 

andandfloat('10.25') 
>>> 10.25 

andandfloat('') 
>>> None 

andand不完全是Python的,但我在一個更好的名字損失。由於您正在捕獲無效值,因此可能爲trap

值得注意的是,一個常見的Python習慣用法是繼續前進,嘗試做你需要做的事情,並在出現異常時處理異常。這被稱爲EAFP,從格言「更容易要求寬恕而不是權限」。所以,也許寫的是一個更Python的方法是:

def maketrap(func, *exceptions): 
    def trap(x): 
     try: 
      return func(x) 
     except exceptions or (Exception,): 
      return None 
    return andand 

trapfloat = maketrap(float) 

# optionally specify the exceptions to convert to a None return 
# (default is to catch anything but you may want to allow some through) 
trapfloat = maketrap(float, ValueError) 
trapfloat = maketrap(float, ValueError, TypeError) 

# if you don't want to store it (i.e. you only need it once or twice)... 
maketrap(float)(x) # ... just call it immediately 

在您的使用情況下,我認爲這種做法是雙贏的:它與任何可以轉換爲float透明的交易,並執行的」正確的事情「,如果一個虛假但可轉換的 - float值(如0)被傳入。

+0

這個解決方案很有創意,在某些用例中絕對有用。但我不想爲每一種我使用的方法創建包裝,特別是如果我只使用一次或兩次。 –

+0

@Andres:你可以立即調用它來處理那些一次性用例:'maketrap(float)(「2.5」)'等等 – kindall

相關問題