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