2016-12-21 5 views
3

Что такое более питонический способ сделать это?Что такое Pythonic способ использовать значение по умолчанию, когда функция возвращает None или генерирует исключение?

try: 
    a = foo() or b 
except AttributeError: 
    a = b 

Я хочу установить a быть возвращение функции foo, но если foo возвращает None или AttributeError возбуждается исключение, то я хочу a быть установлен в b.

+3

это «Pythonic» достаточно. – Maroun

+4

Что делать, если 'foo' возвращает' 0'? –

+0

Если вы делаете это много, вы, возможно, можете использовать декоратор на 'foo'. –

ответ

4

как отметил Геннадий Кандауров: Вы должны были бы проверить на 'действительных' возвращаемых значений foo(), которые не являются 'truthy' (как 0, [], () ...):

try: 
    a = foo() if foo() is not None else b 
except AttributeError: 
    a = b 

в зависимости от деталей реализации foo (будь то дорогой или имеет побочные эффекты), вы можете назвать это только один раз:

try: 
    f = foo() 
    a = f if f is not None else b 
except AttributeError: 
    a = b 
+0

Это вызывает функцию 'foo' дважды, что может быть или не совсем нормально. – TigerhawkT3

+0

Что делать, если 'foo' стоит позвонить? –

+0

да, это тоже. –