Есть ли аналог этой функции в стандартных модулях Python? - PullRequest
1 голос
/ 18 января 2011

Я ищу стандартную функцию (оператор, декоратор), которая была бы эквивалентна следующей рукописной функции:

def defaulted(func, defaultVal):
   try:
      result = func()
   except: 
      result = defaultVal

   return result

Спасибо! * * 1004

Ответы [ 2 ]

5 голосов
/ 18 января 2011

Нет ничего подобного в stdlib (насколько мне известно). С одной стороны, это плохая практика: вы не должны никогда использовать голые except. (Вместо этого укажите исключения, которые вы хотите перехватить; таким образом, вы не поймете все!)

Вот декоратор:

>>> def defaultval(error, value):
...     def decorator(func):
...             def defaulted(*args, **kwargs):
...                     try:
...                             return func(*args, **kwargs)
...                     except error:
...                             return value
...             return defaulted
...     return decorator
...
>>> @defaultval(NameError, "undefined")
... def get_var():
...     return name
...
>>> get_var()
'undefined'
3 голосов
/ 18 января 2011

Нет. Философия Python заключается в том, что явное лучше, чем неявное. Большинство функций Python, которые ожидают регулярного генерирования исключений, например dict .__ getitem__, предоставляют эквивалентные версии, возвращающие значение по умолчанию, например dict.get.

Я использовал новое с контекстами для чего-то подобного раньше; код выглядел так:

with ignoring(IOError, OSError):
    # some non-critical file operations

Но мне тоже ничего не нужно было возвращать. Как правило, уровень целой функции - плохое место для этого, и, используя декораторы, вы заблокируете любой шанс получить ошибку, если захотите обработать ее более изящно в другом месте.

Также, except: чрезвычайно опасен; Вы, вероятно, имеете в виду (по крайней мере) except Exception:, и, возможно, что-то еще более узко ограниченное, например, IOError или KeyError. В противном случае вы также поймаете такие вещи, как Ctrl-C, SystemExit и имена переменных с ошибками.

...