Одна из самых популярных задач при работе с консолью, запросить у пользователя подтверждение в формате да/нет. На первый взгляд кажется простым, но за кулисами скрывается множество нюансов: регистр символов, пробелы, опечатки, «y/n» вместо «да/нет» и необходимость повторного запроса при ошибке. В этой статье мы разберёмся, как реализовать надёжный и удобный «да/нет»-ввод в Python, начиная с базового input и заканчивая готовыми библиотечными решениями.
Базовый способ: «велосипед» из input
Минимальный пример, который чаще всего показывают новичкам:
answer = input("Продолжить? (да/нет): ")
if answer.lower == "да":
print("Поехали!")
else:
print("Отменено.")
Плюсы: коротко и понятно.
Минусы: не проверяет пустой ввод, не обрабатывает «Yes», «y», «1» и т.д.
Улучшенная версия: цикл + проверки
Чтобы защититься от дурака, завернём запрос в бесконечный цикл и добавим «белый список» допустимых ответов:
def ask_yes_no(question: str) -> bool:
"""Возвращает True при ответе 'да' и False при ответе 'нет'."""
YES = {"да", "д", "yes", "y", "1"}
NO = {"нет", "н", "no", "n", "0"}
while True:
answer = input(f"{question} (да/нет): ").strip.lower
if answer in YES:
return True
if answer in NO:
return False
print("Пожалуйста, введите 'да' или 'нет'.")
if ask_yes_no("Запустить процесс"):
print("Стартуем...")
Что улучшили:
- Игнорируем регистр и лишние пробелы (
.strip.lower). - Понимаем сразу несколько вариантов («y», «1»).
- Зацикливаемся до тех пор, пока не получим валидный ответ.
Форматирование и локализация
Если ваше приложение будет переводиться, храните допустимые ответы в словаре:
LOCALES = {
"ru": {"yes": {"да", "д", "yes", "y"}, "no": {"нет", "н", "no", "n"}},
"en": {"yes": {"yes", "y"}, "no": {"no", "n"}}
} Такой подход позволяет легко расширять список языков без изменения логики.
Обработка Ctrl+C и EOF
Пользователь может закрыть терминал или нажать Ctrl+C. Добавим аккуратное завершение:
import sys
def safe_ask(prompt):
try:
return ask_yes_no(prompt)
except (KeyboardInterrupt, EOFError):
sys.exit("
Прервано пользователем")
Библиотечные «плюшки»
click
Установка: pip install click
import click
if click.confirm("Продолжить?", default=True):
...
PyInquirer / InquirerPy (TUI-режим)
from InquirerPy import prompt
question = {
"type": "confirm",
"message": "Подтвердить действие?",
"default": True,
}
result = prompt(question) # True/False
Плюсы: стрелочки, подсветка, кроссплатформенность.
Минусы: дополнительная зависимость, 2–4 МБ к дистрибутиву.
Подводим итоги
- Минимум: используйте
input+ цикл для простых сценариев. - Стандарт: вынесите логику в функцию
ask_yes_noс множествами вариантов. - Максимум: подключите
clickилиInquirerPyдля продакшена.
Независимо от выбранного подхода, главное — не забывать обрабатывать неверный ввод и предоставлять пользователю понятную обратную связь. Тогда ваш «да/нет» будет работать как часы в любых руках.