在下面的代码中,我使用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__
答案 0 :(得分:4)
assert
不用于输入验证,它用于查找您构建代码的假设中的缺陷。它是一个调试和文档工具,但可以禁用它。如果您想提供一个好的错误消息,raise TypeError("Object is not a bound method")
- 这就是它的用途。
答案 1 :(得分:1)
在我看来,这里assert
正在检查代码正在做出的假设。如果类使用不正确(即编程错误),它将失败。
如果情况确实如此,那么assert
的使用就是恕我直言。确实,当事情使用不当时,Python会慷慨地抛出异常,而EAFP是一个很好的策略。然而,有时解释器抛出的错误不够描述,无法轻松找到问题,在这种情况下assert
是合适的。它还应该与适当的文档相结合,说明类期望如何使用(即传递的方法应该具有某些属性)。
如果我误解了您的示例并且您使用assert
来验证用户可能会犯错的内容,那么这不是一个好主意。