2016-04-16 1 views
10

В Python можно использовать однострочные элементы для установки значений со специальными условиями (такими как значения по умолчанию или условия) простым, интуитивно понятным способом.Обработка однолинейных исключений

result = 0 or "Does not exist." # "Does not exist." 

result = "Found user!" if user in user_list else "User not found." 

Можно ли написать аналогичное заявление, которое ловит исключения?

from json import loads 

result = loads('{"value": true}') or "Oh no, explosions occurred!" 
# {'value': True} 

result = loads(None) or "Oh no, explosions occurred!" 
# "Oh no, explosions occurred!" is desired, but a TypeError is raised. 
+2

Почему бы не поставить стандарт 'try..except' в функцию? – TigerhawkT3

+0

@Slayer Интересно, что Python фактически использует строку (или любой другой объект, фактически) как «альтернативный» для 'или'. '0 или" Не существует. "' Will return '" Не существует. "'. (Я протестировал его.) – 2Cubed

+0

@ TigerhawkT3 У меня нет доступа к внутренним функциям 'divide_one_by' - предположим, что он определен в отдельном модуле, который я использую в качестве зависимости. – 2Cubed

ответ

14

Невозможно выполнить однострочный оператор обработки исключений в python. Можно написать функцию для этого. Использование

def safe_execute(default, exception, function, *args): 
    try: 
     return function(*args) 
    except exception: 
     return default 

Пример:

from json import loads 
safe_execute("Oh no, explosions occurred!", TypeError, loads, None) 
# Returns "Oh no, explosions occurred!" 
safe_execute("Huh?", TypeError, int, "10") 
#Returns 10 

Несколько аргументов поддерживаются

from operator import div 
safe_execute(
    "Divsion by zero is invalid.", 
    ZeroDivisionError, 
    div, 1, 0 
) 
# Returns "Divsion by zero is invalid." 

safe_execute(
    "Divsion by zero is invalid.", 
    ZeroDivisionError, 
    div, 1, 1 
) 
# Returns 1. 

Процесс ошибки выделяющийся все еще может быть прервана:

from time import sleep 
safe_execute(
    "Panic!", 
    Exception, 
    sleep, 8 
) 
# Ctrl-c will raise a KeyboardInterrupt 

from sys import exit 
safe_execute("Failed to exit!", Exception, exit) 
# Exits the Python interpreter 

Если такое поведение является нежелательным , использовать BaseException:

from time import sleep 
safe_execute("interrupted", 
      BaseException, 
      sleep, 8) 
#Pressing Ctrl-c will return "interrupted" 
from sys import exit 
safe_execute("Naughty little program!", 
      BaseException, 
      exit) 
#Returns "Naughty little program!" 
0

Это возможно в одной строке с помощью Exec:

parse_float = lambda x, y=exec("def f(s):\n try:\n return float(s)\n except: return None"): f(x) 
Смежные вопросы