2010-09-15 39 views
9

我读过有关何时使用断言与例外,但我仍然没有“得到它”。好像每当我觉得我是在一个情况下,我应该使用断言,以后的发展中,我发现,我在“看之前,我的飞跃”,以确保当我打电话功能的断言不会失败。既然还有另外一种Python倾向于使用try-except的习惯用法,我通常最终会放弃assert并抛出异常。我还没有找到一个恰当的地方使用断言。任何人都可以拿出一些很好的例子吗?在Python中使用assert的例子?

回答

20

时,其触发装置一错误代码中的一个很好的指导使用assert。当你的代码假定某件事并假设时,建议使用assert来保护这个假设。 assert失败意味着您的假设不正确,这意味着您的代码不正确。

3

Generelly,断言有没有验证你对自己的代码,也就是在那个时间点的假设,无论是断言成功,或者您的实现在某种程度上马车。一个例外就是要发生一个错误,并“拥抱”它,即允许你处理它。

3

一个很好的例子是检查函数的参数的一致性:

def f(probability_vector, positive_number): 
    assert sum(probability_vector) == 1., "probability vectors have to sum to 1" 
    assert positive_number >= 0., "positive_number should be positive" 
    # body of function goes here 
+1

有趣 - 我不知道'0.'是简写'0.0'。 repl说它是。我可能不会在真实代码中使用它,尽管它看起来过于“巧妙”,并且很容易被忽略。可以理解为一个错字,但0.0总是被理解为一个浮点数。 – Daenyth 2010-09-15 19:42:15

+0

这似乎与我有一个从2D矩阵中获取元素的函数相似。断言行和列输入实际上在矩阵的范围内是有意义的。但后来我做了一些事情,我拿了一个元素,想用相邻元素做点什么。一旦我开始对它进行编码,当元素位于边缘时,我不得不有特殊情况,因为相邻元素在矩阵之外。改用异常似乎更好。 – Colin 2010-09-15 19:46:16

+0

异常会如何更容易修改代码?当你改变函数的行为时,你仍然需要修改异常提升部分,不是吗? – pberkes 2010-09-15 19:54:36

15

倾向于使用断言来检查的事情,绝不应该发生。有点像健康检查。

意识到的另一件事是优化时asserts被删除:

当前的代码生成器发出无代码断言语句时,被要求在编译时优化。

+4

+1用于指出如果使用'-O'标志调用Python,那么断言将被删除。关键在于,如果你期望*你的代码的行为不同,如果你断言,那么你滥用它们 - 它们只用于调试。 – 2010-09-15 20:22:21