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
.
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
Me gusta, con la sugerencia de tokland, es sucinto y poderoso. –