1

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

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

   return result

谢谢!

4

2 回答 2

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'
于 2011-01-18T18:46:23.450 回答
3

不,Python 的理念是显式优于隐式。大多数预期会定期抛出异常的 Python 函数,如 dict.__getitem__,提供了返回默认值的等效版本,如 dict.get。

我以前用过 new with contexts 来做类似的事情;代码看起来像:

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

但我也不需要返回任何东西。一般来说,整体功能级别是一个不好的地方,如果你想在其他地方更优雅地处理它,通过使用装饰器你会阻止任何实际得到错误的机会。

而且,except:是极其危险的;您可能是指(至少)except Exception:,并且可能是范围更窄的东西,例如 IOError 或 KeyError。否则,您还会发现诸如 Ctrl-C、SystemExit 和拼写错误的变量名之类的东西。

于 2011-01-18T18:46:55.920 回答