2011-10-26 12 views

cevap

9

Biz onlardan biri yok ama zor değil kendi rulonuzu rulo yapın:

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'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

+0

Bunu sevdim, tokland'ın önerisiyle, özlü ve güçlü. –

4

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).

+0

Bu çözüm yaratıcıdır ve bazı kullanım durumlarda kesinlikle yararlıdır. Ancak, kullandığım her bir yöntem için sarmalayıcılar oluşturmak istemiyorum, özellikle sadece bir veya iki kez kullanırsam. –

+0

@Andres: Sadece bir kerelik kullanım için hemen arayabilirsiniz: maketrap (float) ("2.5") 'vb. – kindall

İlgili konular