Почему мой оператор if выдает ключевую ошибку? - PullRequest
2 голосов
/ 04 июля 2019

У меня есть представление, которое просто проверяет наличие ключа в хранилище сеансов, и если оно присутствует, оно удаляет его, а если его нет, должно пройти , возможно, стоит отметить, что хранилище ключейхранение идентификаторов экземпляров модели.

def RefreshInstances(request):

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

    return redirect('/')

Это работает и достигает своей цели, удаляя экземпляры, однако, если хранилище ключей пусто, я получаю ошибку ключа, а не просто передаваемый код?

Может ли кто-нибудь пролить свет?

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 04 июля 2019

Доступ к ключам диктов (или диктовок), которые не существуют, повышает 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.
3 голосов
/ 04 июля 2019

Это можно сжать в одну строку:

request.session.pop('instances', None)
2 голосов
/ 04 июля 2019

Если вы используете request.session['instances'], вы выполняете поиск. Если ключ (здесь 'instances') недоступен, он поднимет KeyError. Таким образом, ошибка выдается за до . Истинность выражения оценивается оператором if.

Однако лучше просто использовать .pop(..) здесь:

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

Это удалит ключ, если он доступен, и в противном случае ничего не сделает. Он вернет значение, которое было связано с ключом 'instances', если такое значение существует, и вернет None в противном случае.

...