Raymond'un fikrinden yola çıkarak, işte bu tür koşullu paketleyicileri hazırlamak için bir fabrika. Python'u sizin için yazarken neden kendinize yazabilirsiniz?
def makeandand(func):
return lambda x: func(x) if x else None
andandfloat = makeandand(float)
andandfloat('10.25')
>>> 10.25
andandfloat('')
>>> None
andand
tam Pythonic değil, ama daha iyi bir isim bir kayıp değilim. Belki geçersiz değeri yakaladığınızdan trap
.
Yaygın bir Python deyimine devam etmek ve yapmanız gerekenleri yapmaya çalışmak ve geldikleri gibi istisnalarla uğraşmaktır. Buna EAFP denir, maksimden “İzin Verme İstisndan Daha Kolaydır”. o şeffaf bir float
dönüştürülebilir şey ilgilenir ve "yapar: kullanımınız durumda
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
bence bu yaklaşım bir kazançtır
: Yani belki o yazmak için daha fazla Pythonic yoludur doğru şey "eğer bir falsi-ama-dönüştürülebilir-to-
float
değeri (0 gibi).
Ruby'nin taklidini gönderirse: return (func (x) if (x değil None) else Yok). Ve belki de isteğe bağlı ekstra args gönder: def vend (x, func, * args, ** kwargs) – tokland
Bunu sevdim, tokland'ın önerisiyle, özlü ve güçlü. –