Как разрешить KeyError, когда пользователь вводит несуществующий элемент?

частичный код

if password_Dictionary[username] == password:
    print("Allow!\n")
    break
else:
    print("Wrong!\n")

ошибка

if password_Dictionary[username] == password:
KeyError: 'cskmcdsk'

объяснение

Если пользователь вводит имя пользователя, но не правильный пароль enter code here, программа правильно запускает оператор печати, в котором говорится, что пользователь ввел неправильный пароль, но когда пользователь вводит неправильное имя пользователя / тот, который не существует, возникает ошибка KeyError с помощью cskmcdsk. это случайное имя пользователя, которое пользователь пытался ввести, но его не существует.

вопрос

Как мне остановить кодирование от ошибки и вместо этого продолжить работу и вместо этого распечатать вывод, в котором указано, что имя пользователя отсутствует в словаре?

вы можете использовать -> "if username in password_Dictionary", чтобы проверить, доступен ли этот ключ в словаре. если он вернет false. затем укажите эту ключевую ошибку

PushpikaWan 27.10.2018 05:44

Кроме того, вы можете заключить "password_Dictionary [username] в блок try except, но вы должны делать это только в том случае, если это ошибка, если это ожидаемое событие, то ответ Lucefer более уместен.

TZubiri 27.10.2018 05:50
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
49
2

Ответы 2

Вы можете просто использовать блок try catch для ключевой ошибки, поэтому, когда есть ошибка, вы можете ее поймать и сделать все, что захотите, когда вы поймаете KeyError.

Нет, вы должны использовать отлично читаемый .get(key, defaultvalue). if key in dict: редко имеет смысл, потому что вы, скорее всего, тоже собирались убрать ценность. использование KeyError просто неправильно, минимум 4 строки для того, что вы могли бы сделать в 1-2, а также добавить ненужную идентификацию и сделать его менее читаемым.

Purple Ice 27.10.2018 12:06

Не используйте блок try / except (исключения не относятся к нормальному потоку управления). Вместо этого либо проверьте наличие ключа в dict, например

if username in dictionary and dictionary[username] == password:
    # do stuff

или, в качестве альтернативы, используйте dict.get, который вернет None, или какое-то значение по умолчанию (обязательно выберите значение по умолчанию, которое также не будет значением другой стороны ==), например

{}.get('notakey')         #=> None
{}.get('notakey', 'foo')  #=> 'foo'

Кстати, если вы храните пароли, убедитесь, что вы используете надежную одностороннюю хеш-функцию (например, BCrypt).

@QRuns Хорошо, это ответ на ваш вопрос? Не забудьте проголосовать / принять ответы на ваши вопросы:)

Andrew Marshall 30.10.2018 14:04

Другие вопросы по теме