Python Try Catch Block dentro de lambda

¿Es posible usar el bloque try catch dentro de una función lambda? Necesito la función lambda para convertir una determinada variable en un entero, pero no todos los valores podrán convertirse en enteros.

No Una lambda de Python solo puede ser una expresión única. Usa una función nombrada.

Es conveniente escribir una función genérica para convertir tipos:

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

Entonces puedes escribir tu lambda:

 lambda v: tryconvert(v, 0, int) 

También puede escribir tryconvert() para que devuelva una función que tome el valor para convertir; entonces no necesitas la lambda

 def tryconvert(default, *types): def convert(value): for t in types: try: return t(value) except (ValueError, TypeError): continue return default # set name of conversion function to something more useful namext = ("_%s_" % default) + "_".join(t.__name__ for t in types) if hasattr(convert, "__qualname__"): convert.__qualname__ += namext convert.__name__ += namext return convert 

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

En esta instancia específica, puedes evitar usar un bloque try como este:

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

El método de cadena isdigit() devuelve verdadero si todos los caracteres de s son dígitos. (Si necesita aceptar números negativos, tendrá que hacer una comprobación adicional).

Dependiendo de su necesidad, otro enfoque podría ser mantener el bash: atrapar fuera de lambda fn

 toint = lambda x : int(x) strval = ['3', ''] for s in strval: try: print 2 + toint(s) except ValueError: print 2 

Salida:

 5 2 

Si bien no hay una forma general de manejar las excepciones en una expresión lambda, puede lograrlo de forma restringida para al menos un tipo de excepción; lanzar un StopIteration desde una parte de una expresión y capturarlo en otra parte es alcanzable; ver:

 from random import randrange list((lambda:(yield from (randrange(0,2) or next(iter(())) for _ in (None,))))()) 

donde next(iter(())) genera una StopIteration mientras que el yield from lo captura; la expresión anterior devuelve aleatoriamente [] o [1] acuerdo con el valor aleatorio interno (un 0 provocará la excepción y un 1 se evaluará normalmente).

Puede leer más sobre esto en http://baruchel.github.io/python/2018/06/20/python-exceptions-in-lambda/ .