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

`assert 1,2 == (2,3)` does not raise an AssertionError in python3

如题所述

我期待

assert 1,2 == (2,3)

提出 AssertionError 但它没有提出。

也没有
assert 1,2 == 2

有人知道为什么吗?

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

assert 1 等同于 assert True

你可以通过尝试看到这个

assert 0,1 == (0,1) 确实加注了。

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 !"

更多细节

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,它 JUMPs.