如何更改 Python AssertionError 中的消息?

我按照下面的内容写,在比较两个多行 Unicode 文本块时,我试图产生一个不错的错误消息。进行比较的内部方法提出了一个断言,但默认的解释对我来说毫无用处

我需要在代码中添加一些内容,如下所示:

def assert_long_strings_equal(one, other):
lines_one = one.splitlines()
lines_other = other.splitlines()
for line1, line2 in zip(lines_one, lines_other):
try:
my_assert_equal(line1, line2)
except AssertionError, error:
# Add some information to the printed result of error??!
raise

我无法弄清楚如何在我捕获的 assertionerror 中更改打印的错误消息。我总是得到 AssertionError: u'something' != 'something else',它只显示输出的第一行。

如何更改断言消息以打印出我想要的任何内容?

如果是相关的,我将使用 nose来运行测试。

97437 次浏览

可以在创建异常时传递所需的消息。

raise AssertionError(line1 + ' != ' + line2)

希望这个能帮上忙。

assert expression, info

比如说,

>>> assert False, "Oopsie"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: Oopsie

来自 医生:

断言语句是一种方便的方法 将调试断言插入到 程序:

assert_stmt ::=  "assert" expression
["," expression]

简单的形式, assert expression,相当于

if __debug__:
if not expression:
raise AssertionError

扩展形式

assert expression1, expression2

相当于

if __debug__:
if not expression1:
raise AssertionError(expression2)

这些等价假设 __debug__AssertionError引用内置变量 在当前实现中, 内置变量 __debug__是 正常情况下是真的,假的 当需要进行优化时 (命令行选项 -O) 代码生成器不发出 当优化为 在编译时请求。请注意 没有必要包括 表达式的源代码 在错误消息中失败; 它将 作为堆栈的一部分显示 Trace.

您希望获取捕获的异常,将其转换为字符串,将其与一些附加的字符串信息组合,然后引发一个新的异常。

x = 3
y = 5
try:
assert( x == y )
except AssertionError, e:
raise( AssertionError( "Additional info. %s"%e ) )

使用 e.args,不推荐使用 e.message

try:
assert False, "Hello!"
except AssertionError as e:
e.args += ('some other', 'important', 'information', 42)
raise

这保留了原始的回溯,最后的部分看起来像这样:

AssertionError: ('Hello!', 'some other', 'important', 'information', 42)

同时适用于 Python 2.7和 Python 3。