2011-10-26 9 views

Respuesta

9

No tener uno de esos, pero no es difícil de haga el suyo:

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

para imitar el andando de Ruby y: return (func (x) if (x no es Ninguno) else Ninguno). Y tal vez envíe args adicionales opcionales: def andand (x, func, * args, ** kwargs) – tokland

+0

Me gusta, con la sugerencia de tokland, es sucinto y poderoso. –

4

Despegando la idea de Raymond, aquí hay una fábrica para hacer envoltorios condicionales de este tipo. ¿Por qué escribirlas usted mismo cuando puede hacer que Python las escriba por usted?

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

andandfloat = makeandand(float) 

andandfloat('10.25') 
>>> 10.25 

andandfloat('') 
>>> None 

andand no es exactamente Pythonic, pero estoy en una pérdida de un nombre mejor. Tal vez trap ya que está atrapando el valor no válido.

Vale la pena señalar que un modismo común de Python es seguir adelante y tratar de hacer lo que necesita hacer, y lidiar con las excepciones a medida que se presenten. Esto se llama EAFP, de la máxima "es más fácil pedir perdón que permiso". Así que tal vez de una manera más Pythonic a escribir que es:

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 

En el caso de uso, creo que este enfoque es una victoria: de forma transparente se ocupa de nada que se puede convertir a un float, y lo hace "el Lo correcto "si se pasa un valor falsy-pero-convertible-a-float.

+0

Esta solución es creativa y definitivamente útil en algunos casos de uso. Pero no quiero crear envoltorios para cada método que uso, especialmente si solo uso cada una o dos veces. –

+0

@Andres: puede llamarlo inmediatamente para esos casos de uso únicos: 'maketrap (float) (" 2.5 ")', etc. – kindall

Cuestiones relacionadas