如何更改Python AssertionError中的消息?

And*_*ack 47 python exception nose assertions

我正在编写以下内容,在比较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
Run Code Online (Sandbox Code Playgroud)

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

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

如果它是相关的,我nose用来运行测试.

Kat*_*iel 82

assert expression, info
Run Code Online (Sandbox Code Playgroud)

例如,

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

来自文档:

断言语句是将调试断言插入程序的便捷方式:

assert_stmt ::=  "assert" expression
["," expression] 
Run Code Online (Sandbox Code Playgroud)

简单的形式, assert expression相当于

if __debug__:
    if not expression:
        raise AssertionError 
Run Code Online (Sandbox Code Playgroud)

扩展形式

assert expression1, expression2
Run Code Online (Sandbox Code Playgroud)

相当于

if __debug__:
    if not expression1:
        raise AssertionError(expression2)
Run Code Online (Sandbox Code Playgroud)

这些等价假定 __debug__AssertionError使用这些名称引用内置变量.在当前实现中,内置变量__debug__在正常情况下为True,在请求优化时为False(命令行选项-O).在编译时请求优化时,当前代码生成器不会为assert语句发出任何代码.请注意,不必在错误消息中包含失败的表达式的源代码; 它将显示为堆栈跟踪的一部分.

  • 请注意,您还可以在`info`字符串表达式中嵌入换行符,以使它们在显示时看起来很漂亮. (2认同)
  • 拍拍额头。现在很清楚为什么 `assert(condition, message)` 会以始终为真的警告中断:assert 是一个运算符而不是一个函数,因此该语句测试一个元组。而是`断言条件消息` (2认同)

Hon*_*rek 54

使用e.args,e.message已弃用.

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

这保留了原始追溯.它的最后一部分看起来像这样:

AssertionError: ('Hello!', 'some other', 'important', 'information', 42)
Run Code Online (Sandbox Code Playgroud)

适用于Python 2.7和Python 3.

  • @matanster 与打印不同,断言仍然是 Python 3 https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement 中的一个语句 (2认同)

Rus*_*ove 6

您希望获取捕获的异常,将其转换为字符串,将其与一些其他字符串信息组合,并引发新的异常.

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

  • 我没有看到任何已发布的答案提供了如何向异常添加信息并使用原始信息和附加信息重新加注的一般解决方案,我认为这是OP所要求的. (4认同)