【问题标题】:Why is my if statement producing a key error?为什么我的 if 语句会产生关键错误?
【发布时间】:2019-11-15 07:04:40
【问题描述】:

我有一个视图,它只是检查会话存储中的密钥,如果它存在,它将删除它,如果它不存在,它应该通过,值得注意的是密钥存储持有模型实例的 ID。

def RefreshInstances(request):

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

    return redirect('/')

这有效并实现了删除实例的目标,但是如果密钥库为空,我会收到密钥错误,而不是刚刚传递的代码?

谁能解释一下?

提前致谢。

【问题讨论】:

  • request.session['instances'] 抛出 KeyError 如果密钥不存在。我想你想要的是if 'instances' in request.session:
  • 另外else: pass 是没有意义的。

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


【解决方案1】:

访问不存在的dicts(或dictlikes)的键确实会引发KeyError

您可以显式检查密钥:

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

或者您可以使用.get() 方法,如果键不存在,它会返回一个默认值(默认为None)——这也很方便,因为诸如 0、''、False、[] 之类的虚假值等通过测试:

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】:

    这可以压缩成一行:

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

    【讨论】:

      【解决方案3】:

      如果您使用request.session['instances'],则执行查找。如果密钥(此处为'instances')不可用,它将引发KeyError。因此,在if 语句评估表达式的真实性之前抛出错误。

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

      request.session<b>.pop(</b>'instances'<b>, None)</b>

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

      【讨论】:

        猜你喜欢
        • 2020-02-20
        • 1970-01-01
        • 1970-01-01
        • 2019-03-04
        • 1970-01-01
        • 2020-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多