【问题标题】:Is there an analogue of this function in Python standard modules?Python标准模块中是否有此功能的类似物?
【发布时间】:2011-06-11 07:04:52
【问题描述】:

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

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

   return result

谢谢!

【问题讨论】:

  • 你知道except: is often evil吗?您可能不希望这样的函数吞下语法错误...
  • @delnan:请不要再重复这个神话,即 except: 会阻止 SyntaxErrors。除非您正在动态编译代码(或首先在该块中导入模块,这是同一件事),否则它不会。它阻止了足够多的真实问题,我们不需要夸大它有多糟糕。
  • @Joe:噢!当然它不会吞下 SyntaxError,对于错误信息,我们深表歉意。
  • 虽然它不会吞下 SyntaxErrors,但它会吞下 KeyboardInterrupt 和 SystemExit,这两者通常都不想捕获。
  • (除了except)发布的代码有什么问题?这对我来说似乎很好。你不喜欢它什么?

标签: python exception standard-library


【解决方案1】:

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'

【讨论】:

    【解决方案2】:

    没有。 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 和拼写错误的变量名等内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多