为什么这个简单的断言在python中失败了?

时间:2014-05-27 22:07:44

标签: python django assertions

所以我有一个页面需要返回内容或在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的新手,所以我可能会遗漏一些明显的东西。

2 个答案:

答案 0 :(得分:5)

In [15]: id(code)
Out[15]: 29536080

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

使用is,您要问的是代码和403是否是同一个对象。

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

Python从-5 to 256缓存小整数的值,这就是为什么你的比较适用于200.

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

from the docs here

答案 1 :(得分:2)

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

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

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