Pythonic处理此错误案例

时间:2011-09-04 09:54:33

标签: python error-handling assert

在下面的代码中,我使用assert是否合理?如果有任何错误,当我尝试访问属性时,无论如何都会发生错误。另一方面,断言提供描述性错误消息。

你认为我应该保留这个断言吗?

class WeakBoundMethod:
    def __init__(self, meth):
        assert (hasattr(meth, '__func__') and hasattr(meth, '__self__')),\
               'Object is not a bound method.'

        self._self = weakref.ref(meth.__self__)
        self._func = meth.__func__

2 个答案:

答案 0 :(得分:4)

assert 用于输入验证,它用于查找构建代码的假设中的缺陷。它是一个调试和文档工具,但可以禁用它。如果您想提供一个好的错误消息,raise TypeError("Object is not a bound method") - 这就是它的用途。

答案 1 :(得分:1)

在我看来,这里assert正在检查代码正在做出的假设。如果类使用不正确(即编程错误),它将失败。

如果情况确实如此,那么assert的使用就是恕我直言。确实,当事情使用不当时,Python会慷慨地抛出异常,而EAFP是一个很好的策略。然而,有时解释器抛出的错误不够描述,无法轻松找到问题,在这种情况下assert是合适的。它还应该与适当的文档相结合,说明类期望如何使用(即传递的方法应该具有某些属性)。


如果我误解了您的示例并且您使用assert来验证用户可能会犯错的内容,那么这不是一个好主意。