【问题标题】:`assert 1,2 == (2,3)` does not raise an AssertionError in python3`assert 1,2 == (2,3)` 不会在 python3 中引发 AssertionError
【发布时间】:2019-02-22 13:49:28
【问题描述】:

如标题所述

我期待

assert 1,2 == (2,3)

提出AssertionError 但它没有。

也没有

assert 1,2 == 2

有人知道为什么吗?

【问题讨论】:

  • 因为assert 在逗号后面有一个参数...
  • 所以它被评估为assert 1, (2 == 2),如果第一个参数是假的,那么断言错误将打印2 == 2的输出

标签: python testing assertion


【解决方案1】:

断言语法将检查逗号之前的内容,接下来是打印的内容,以防断言为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 !"

【讨论】:

    【解决方案2】:

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

    assert 1assert True 相同

    你可以试试看

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

    【讨论】:

      【解决方案3】:

      详细介绍

      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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多