【问题标题】:why is this simple in assertion failing in python?为什么这个简单的断言在 python 中失败了?
【发布时间】:2014-05-27 22:07:44
【问题描述】:

所以我有一个页面,预计在 django 中返回内容或返回 403 页面

response = self.client.get(...)
print response.status_code
print type(response.status_code)
assert response.status_code is 200
print "WHAT IS GOING ON!?!?!?!"
response = self.client.get(...)
code = response.status_code
print code
print type(code)
assert code is 403
print "hmm"

返回输出:

200
<type 'int'>
WHAT IS GOING ON!?!?!?!
403
<type 'int'>

很明显,代码在assert code is 403 处失败,但我无法想象为什么。我什至通过将行更改为assert 403 is 403 来检查自己的理智,并且测试通过了。我是 Python 和 Django 的新手,所以我可能会遗漏一些明显的东西。

【问题讨论】:

  • 感谢 nija 的编辑,你已经打败了我
  • 尝试 == 而不是 is 因为 200 值不一定与您要比较的对象相同
  • 200 断言有效,而 403 则无效。和 == 是一个很好的解决方法,但知道为什么会很好。
  • see
  • 如果== 有效而is 无效,那么您无论如何都错误地使用了is。应使用== 进行相等性测试。应该 only 用于验证一个对象是 exact same 对象。

标签: python django assertions


【解决方案1】:
In [15]: id(code)
Out[15]: 29536080

In [16]: id(403)
Out[16]: 29535960

使用is,您是在询问 code 和 403 是否是同一个对象。

从 id 可以看出,它们不是。您需要403 == code 来比较值。

Python 缓存来自-5 to 256 的小整数值,这就是为什么您的比较适用于 200。

当前的实现为 -5 到 256 之间的所有整数保留一个整数对象数组,当您在该范围内创建一个 int 时,实际上您只是获取对现有对象的引用。 p>

from the docs here

【讨论】:

    【解决方案2】:

    Python 测试中的 is 关键字 identity, not equality

    换句话说,它测试两个对象是否是完全相同的对象。您正在比较的对象response.status_code403 是不同的对象,可能是因为403 对象是在堆栈上创建的临时对象(因为缺乏更好的描述)。这两个对象将具有不同的内存地址。

    我想之前针对200 的测试是偶然的,但我希望它会因为同样的原因而失败。

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 1970-01-01
      • 2016-09-23
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多