Python标准模块中是否存在此函数的类似内容?

时间:2011-01-18 18:40:38

标签: python exception standard-library

我正在寻找一个标准函数(运算符,装饰器),它等同于以下手写函数:

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

   return result

谢谢!

2 个答案:

答案 0 :(得分:5)

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'

答案 1 :(得分:3)

没有。 Python的哲学是明确比隐含更好。大多数期望定期抛出异常的Python函数,如dict .__ getitem__,提供返回默认值的等效版本,如dict.get。

我之前使用过新的带上下文的东西;代码看起来像:

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

但我也不需要退货。一般来说,整个功能级别对此来说是一个不好的地方,并且通过使用装饰器,如果你想在其他地方更优雅地处理它,你就会阻止实际获得错误的任何机会。

此外,except:非常危险;你可能意味着(至少)except Exception:,可能还有更严格的范围,比如IOError或KeyError。否则,您还将捕获诸如Ctrl-C,SystemExit和拼写错误的变量名称之类的内容。