Можно ли использовать блок catch catch внутри лямбда-функции. Мне нужна функция лямбда для преобразования определенной переменной в целое число, но не все значения могут быть преобразованы в целые числа.
Python Try Catch Block внутри лямбда
Ответ 1
Неа. Лямбда Python может быть только одним выражением. Используйте именованную функцию.
Удобно написать общую функцию для преобразования типов:
def tryconvert(value, default, *types):
for t in types:
try:
return t(value)
except ValueError, TypeError:
continue
return default
Затем вы можете написать свой лямбда:
lambda v: tryconvert(v, 0, int)
Вы также можете написать tryconvert()
, чтобы он возвращал функцию, которая принимает значение, которое нужно преобразовать; то вам не нужна лямбда:
def tryconvert(default, *types):
def convert(value):
for t in types:
try:
return t(value)
except ValueError, TypeError:
continue
return default
return convert
Теперь tryconvert(0, int)
возвращает функцию convert(value)
, которая принимает значение и преобразует его в целое число, и возвращает 0
, если это невозможно.
Ответ 2
В этом конкретном случае вы можете избежать использования блока try
следующим образом:
lambda s: int(s) if s.isdigit() else 0
isdigit()
string method возвращает true, если все символы s
являются цифрами. (Если вам нужно принять отрицательные числа, вам нужно будет сделать дополнительную проверку.)
Ответ 3
В зависимости от вашей потребности, другой подход может заключаться в том, чтобы попытаться: поймать вне lambda fn
toint = lambda x : int(x)
strval = ['3', '']
for s in strval:
try:
print 2 + toint(s)
except ValueError:
print 2
Вывод:
5
2