所以我有一个页面需要返回内容或在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的新手,所以我可能会遗漏一些明显的东西。
答案 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时,实际上只返回对现有对象的引用。
答案 1 :(得分:2)
Python中的is
关键字测试identity, not equality。
换句话说,它测试两个对象是完全相同的对象。您要比较的对象response.status_code
与403
不同,可能是因为403
对象是在堆栈上创建的临时对象(缺少更好的描述) )。这两个对象将具有不同的内存地址。
我认为之前对200
的测试是偶然的,但我希望它能够因同样的原因而失败。