例如,我有一個對象x
,它可能是None
或浮點數的字符串表示形式。我要做到以下幾點:是否有像Ruby和andand這樣的Python庫(或模式)?
do_stuff_with(float(x) if x else None)
除了不必鍵入x
兩次,與Ruby的andand庫:
require 'andand'
do_stuff_with(x.andand.to_f)
例如,我有一個對象x
,它可能是None
或浮點數的字符串表示形式。我要做到以下幾點:是否有像Ruby和andand這樣的Python庫(或模式)?
do_stuff_with(float(x) if x else None)
除了不必鍵入x
兩次,與Ruby的andand庫:
require 'andand'
do_stuff_with(x.andand.to_f)
我們沒有這些之一,但它並不難自己推出:
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
起飛雷蒙德的想法,這裏有一個製作這種條件包裝的工廠。爲什麼在你可以讓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)被傳入。
這個解決方案很有創意,在某些用例中絕對有用。但我不想爲每一種我使用的方法創建包裝,特別是如果我只使用一次或兩次。 –
@Andres:你可以立即調用它來處理那些一次性用例:'maketrap(float)(「2.5」)'等等 – kindall
模仿Ruby的andand:return(func(x)if(x不是None)else None)。也許可以發送可選的額外參數:def andand(x,func,* args,** kwargs) – tokland
我喜歡它,托克蘭的建議,它簡潔而強大。 –