好吧,这是一个悬而未决的问题,我想谈谈两个方面:何时添加断言以及如何编写错误消息。
目的
向初学者解释它-断言是可能引发错误的语句,但是您不会抓住它们。而且通常不应该将它们提高,但是在现实生活中,无论如何它们有时都会得到提高。这是一种严重的情况,代码无法从中恢复,我们称之为“致命错误”。
接下来,它是出于“调试目的”,虽然正确,但听起来很不屑一顾。我更喜欢“声明不变式,永远不应该被违反”的表述,尽管它在不同的初学者中的工作方式有所不同……有些“只懂它”,而另一些要么找不到用处,要么替换正常的异常,甚至用它控制流程。
样式
在Python中,assert
它是语句,而不是函数!(请记住assert(False, 'is true')
不会提高。但是,请注意:
何时以及如何编写可选的“错误消息”?
此acually适用于单元测试框架,其通常具有许多专用的方法来做断言(assertTrue(condition)
,assertFalse(condition), assertEqual(actual, expected)
等)。它们通常还提供一种对断言进行评论的方法。
在一次性代码中,您可以不显示错误消息。
在某些情况下,没有要添加的断言:
def dump(something):断言isinstance(something,Dumpable)#...
但是除此之外,一条消息对于与其他程序员(有时是代码的交互用户,例如在Ipython / Jupyter等中)的交互用户很有用。
给他们提供信息,而不仅仅是泄漏内部实施细节。
代替:
assert meaningless_identifier <= MAGIC_NUMBER_XXX, 'meaningless_identifier is greater than MAGIC_NUMBER_XXX!!!'
写:
assert meaningless_identifier > MAGIC_NUMBER_XXX, 'reactor temperature above critical threshold'
甚至:
assert meaningless_identifier > MAGIC_NUMBER_XXX, f'reactor temperature({meaningless_identifier }) above critical threshold ({MAGIC_NUMBER_XXX})'
我知道,我知道-这不是静态断言的情况,但我想指出消息的信息价值。
消极或正面信息?
这可能是肯定的,但阅读以下内容会伤害我:
assert a == b, 'a is not equal to b'
然后,获取AssertionError: a must be equal to b
也是可读的,并且该语句在代码中看起来合乎逻辑。另外,您可以从中获得某些东西而无需阅读回溯(有时甚至不可用)。