2011-09-04 32 views
2

在下面的代码中,我使用的是assert是否合理?如果有任何错误,当我尝试访问属性时会发生错误。另一方面,assert提供了一个描述性的错误信息。Pythonic处理这个错误的案例

你认为我应该保持断言吗?

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__ 

回答

1

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

如果确实如此,那么在这里使用assert是恕我直言的理由。当然,如果使用不当,Python会慷慨地抛出异常,EAFP是一个好策略。然而,有时候解释者所引发的错误并不足以使问题的定位变得容易,在这种情况下,assert是合适的。它还应与适当的文件相结合,说明班级期望如何使用(即通过的方法应具有某些属性)。


如果我误解你的样本,您使用的assert这里来验证东西用户能够与犯错,那么它是不是一个好主意。

+0

是的,这就是我使用代码的方式。我也写了文档。整个班级可以在这里找到:http://codereview.stackexchange.com/questions/4574 –

+0

@Paul:[免责声明]没有仔细阅读整个班级,我认为'assert'没有问题 –

+0

对于downvoter:请解释你不同意的内容。由于这个问题需要一些判断和意见/个人喜好,我认为讨论很有趣。 –

4

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

+0

但我不使用它在这里进行输入验证。我正在检查由于程序员而只能发生的错误情况。还是我断言错误? –

+0

@Paul:方法参数**是**输入。不是*用户*输入,但仍然是输入,因为它来自不总是可信的来源,以提供可用的数据,因此需要验证。另外,'TypeError'对于程序员来说更具描述性。 – delnan

+0

但是,如果程序员犯了一个错误,它只会是错误的输入,它不能来自用户。这不是什么断言? –