很多时候在django python的开源代码中,我看过像这样的场景
if request.META and 'HTTP_REFERER' in request.META:
同样地,我也看到了这两个条件
if request.POST and 'next' in request.POST:
if request.GET and 'next' in request.GET:
我认为只有一个条件足以检查这些情况下的if条件,如
if 'HTTP_REFERER' in request.META:
if 'next' in request.POST:
if 'next' in request.GET:
那么为什么大多数时候人们使用前一次,是否就像双重检查一样,或者有些情况下,第一次双重检查条件可能有用,而后面的单一检查条件可能会失败?
答案 0 :(得分:6)
只有通过检查才能实现
request.META.get('HTTP_REFERER')
和
request.REQUEST.get('next')
而不是检查 request.POST
或 request.GET
答案 1 :(得分:2)
有一个(假设的)案例,你的解决方案会失败:
>>> request.POST = None
>>> 'next' in request.POST
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument of type 'NoneType' is not iterable
但如果您确定request.POST
永远不会是None
,那么您的解决方案就可以了。
在空字典的情况下,它只是稍微慢了一点,因为如果(快速)空虚测试已经失败,可以跳过if 'foo' in request.POST
检查。另一方面,如果字典不为空,它会更快。
>>> import timeit
>>> timeit.timeit(setup="a = {}", stmt="if a and 'next' in a: pass")
0.028279806566242852
>>> timeit.timeit(setup="a = {}", stmt="if 'next' in a: pass")
0.04539217556517272
>>> timeit.timeit(setup="a = {'foo':'bar'}", stmt="if a and 'next' in a: pass")
0.07471092295071458
>>> timeit.timeit(setup="a = {'foo':'bar'}", stmt="if 'next' in a: pass")
0.045236056421884996
>>> timeit.timeit(setup="a = {'next':'bar'}", stmt="if a and 'next' in a: pass")
0.0851067469988891
>>> timeit.timeit(setup="a = {'next':'bar'}", stmt="if 'next' in a: pass")
0.0520663758715898
所以我想这是一个微优化的问题。在这种情况下,我调用Python的Zen:显式优于隐式。
答案 2 :(得分:2)
我刚刚抓住了django的整个(当前git)来源,并且没有找到你提到的所有三个条件的单个出现。
你完全正确的条件是足够,因为你可以假设所有三个词典都已设定。看看django代码,我相信你可以认为。
编辑:django documentation也表示将始终设置这些词典。