`assert 1,2 ==(2,3)`不会在python3中引发AssertionError

时间:2019-02-22 13:49:28

标签: python testing assertion

如标题中所述

我希望

assert 1,2 == (2,3)

举起AssertionError,但没有举起。

都不

assert 1,2 == 2

有人知道为什么吗?

3 个答案:

答案 0 :(得分:3)

assert语法将检查逗号之前的内容,接下来的内容是在声明为False的情况下显示的内容。

尝试一下:

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

您需要做assert (1, 2) == (2, 3), "Assertion failure !"

答案 1 :(得分:1)

这被解析为assert 11 == (2,3)作为单独的参数。

assert 1assert True

您可以尝试一下

assert 0,1 == (0,1)确实会提出。

答案 2 :(得分:1)

要更详细一点

def func():
    assert 1,2 == (2,3)

这是以上函数的dis.dis输出:

          0 LOAD_CONST               1 (1)
          2 POP_JUMP_IF_TRUE        16
          4 LOAD_GLOBAL              0 (AssertionError)
          6 LOAD_CONST               2 (2)
          8 LOAD_CONST               4 ((2, 3))
         10 COMPARE_OP               2 (==)
         12 CALL_FUNCTION            1
         14 RAISE_VARARGS            1
    >>   16 LOAD_CONST               0 (None)
         18 RETURN_VALUE

如您所见,POP_JUMP_IF_TRUE跳到16,从而完全跳过AssertionError。而且由于堆栈的顶部是1,所以它是JUMP个。