为什么我的if语句产生关键错误?

时间:2019-07-04 14:01:51

标签: python django python-3.x django-views

我有一个观点,就是简单地检查会话存储中的密钥,如果它存在,它将删除它,如果它不存在,则应该通过,可能值得注意的是,密钥存储持有模型实例的ID。

def RefreshInstances(request):

    if request.session['instances']:
      del request.session['instances']
    else:
      pass

    return redirect('/')

这有效并达到删除实例的目的,但是,如果密钥存储区为空,我会得到一个密钥错误,而不是刚刚传递的代码?

有人可以照亮吗?

谢谢。

3 个答案:

答案 0 :(得分:3)

可以将其压缩为一行:

request.session.pop('instances', None)

答案 1 :(得分:3)

访问不存在的字典(或类似字典)的键会引发KeyError

您可以显式检查密钥:

if 'instances' in request.session:
   # ...

或者您可以使用.get()方法,如果该键不存在,该方法将返回默认值(默认为None),这也很方便,因为伪造的值(例如0,'',错误,[]等通过测试:

if request.session.get('instances'):
      del request.session['instances']

...但要删除,只需将.pop()设置为默认值且不使用if:

request.session.pop('instances', None)  # Remove `instances` if it's there, do nothing otherwise.

答案 2 :(得分:2)

如果使用request.session['instances'],则执行查找。如果键(此处为'instances')不可用,它将引发一个KeyError。因此,在{em>之前会通过if语句评估表达式的真实性。

不过最好在这里使用.pop(..)

request.session.pop('instances', None)

这将删除密钥(如果有),否则不执行任何操作。如果存在该值,它将返回与'instances'键关联的值,否则返回None