Подтвердить что ты не робот

Python Try Catch Block внутри лямбда

Можно ли использовать блок catch catch внутри лямбда-функции. Мне нужна функция лямбда для преобразования определенной переменной в целое число, но не все значения могут быть преобразованы в целые числа.

4b9b3361

Ответ 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