我正在寻找一个等效于以下手写函数的标准函数(运算符、装饰器):
def defaulted(func, defaultVal):
try:
result = func()
except:
result = defaultVal
return result
谢谢!
我正在寻找一个等效于以下手写函数的标准函数(运算符、装饰器):
def defaulted(func, defaultVal):
try:
result = func()
except:
result = defaultVal
return result
谢谢!
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'
不,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 和拼写错误的变量名之类的东西。