2012-09-16 17 views
24

¿Es posible utilizar try catch block dentro de una función lambda? Necesito la función lambda para convertir una determinada variable en un entero, pero no todos los valores se podrán convertir en enteros.Python Prueba Catch Block dentro de lambda

+0

http://stackoverflow.com/questions/7108193/frequently-repeated-try-except-in-python – squiguy

+1

no _need_ una función lambda. Solo usa una función nombrada en su lugar –

Respuesta

37

Nope. Un Python lambda solo puede ser una sola expresión. Usa una función nombrada.

Es conveniente escribir una función genérica para los tipos de conversión:

def tryconvert(value, default, *types): 
    for t in types: 
     try: 
      return t(value) 
     except ValueError, TypeError: 
      continue 
    return default 

Entonces usted puede escribir su lambda:

lambda v: tryconvert(v, 0, int) 

También podría escribir tryconvert() por lo que vuelve una función que toma el valor a convertir; a continuación, no es necesario el lambda:

def tryconvert(default, *types): 
    def convert(value): 
     for t in types: 
      try: 
       return t(value) 
      except ValueError, TypeError: 
       continue 
     return default 
    return convert 

Ahora tryconvert(0, int) devuelve una función, convert(value), que toma un valor y lo convierte en un entero, y devuelve 0 si esto no se puede hacer.

9

En este caso concreto, se puede evitar el uso de un bloque try así:

lambda s: int(s) if s.isdigit() else 0 

Los isdigit() string method devuelve verdadero si todos los caracteres de s son dígitos. (. Si es necesario aceptar los números negativos, tendrá que hacer alguna comprobación adicional)

1

Dependiendo de su necesidad, otro enfoque podría ser mantener el intento de captura fuera fn lambda

toint = lambda x : int(x) 
strval = ['3', ''] 

for s in strval: 
    try: 
     print 2 + toint(s) 
    except ValueError: 
     print 2 

de salida:

5 
2 
Cuestiones relacionadas