Обработка yes/no ввода в Python: подобно APT interface
Быстрый ответ
Для имитации запроса подтверждения действия, аналогичного APT, можно применить функцию input(), в связке с циклом while:
choice = input("Продолжить? [y/n]: ").lower()
while choice not in ['y', 'n']:
    choice = input("Неверный ввод. Введите 'y' или 'n': ").lower()
if choice == 'y':
    print("Процесс продолжается...")
else:
    print("Остановлен.")
Данный скрипт служит эффективным инструментом для интерактивного запроса у пользователя о продолжении работы программы.

Изучение темы
Качество пользовательского опыта при работе с CLI-приложениями зависит от учета возможного поведения пользователя и создания интуитивно понятного интерфейса. Перейдем к обсуждению полезных подходов для улучшения вашего кода.
Просто нажмите Enter: strtobool
Функция strtobool из модуля Python 'distutils.util' – отличный инструмент для воссоздания функциональности APT, когда нажатие Enter интерпретируется как согласие:
from distutils.util import strtobool
def query_yes_no(question, default="yes"):
    valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False}
    if default is None:
        prompt = " [y/n] "
    elif default == "yes":
        prompt = " [Y/n] "
    elif default == "no":
        prompt = " [y/N] "
    else:
        raise ValueError("Неправильный вариант ответа по умолчанию: '%s'" % default)
    while True:
        choice = input(question + prompt).lower()
        if default is not None and choice == '':
            return valid[default]
        elif choice in valid:
            return valid[choice]
        else:
            print("Пожалуйста, ответьте 'да' или 'нет'!")
response = query_yes_no("Продолжить?")
print("Процесс продолжается..." if response else "Остановлено.")
Эта функция успешно обрабатывает пустые вводы и предлагает вариант ответа по умолчанию.
Кросс-платформенность с Click
Для создания CLI-приложений работающих на разных платформах, рекомендуется использовать библиотеку Click:
import click
if click.confirm('Вы хотите продолжить?', default=True):
    print('Процесс продолжается...')
else:
    print('Прервано.')
Функция confirm() из библиотеки Click обеспечивает ясность и понятность кода, а также его совместимость с разными ОС.
Превращение скрипта в модуль
Модульность упрощает поддержку и расширение кода. Оформим запрос подтверждения в виде функции:
def get_yes_no_input(prompt, error_prompt="Неправильный ввод. Введите 'y' или 'n': "):
    choice = input(prompt).lower()
    while choice not in {'y', 'n'}:
        choice = input(error_prompt).lower()
    return choice == 'y'
if get_yes_no_input("Продолжить? [y/n]: "):
    print("Процесс продолжается...")
else:
    print("Операция остановлена.")
Теперь данную функцию можно использовать в разных частях вашего кода.
Визуализация
Подача запроса на подтверждение в Python напоминает управление движением на дороге:
**Ваш код:**
Продолжить? ➡️ [Yes] или [No]?
**Python**
while True:
    choice = input("Продолжить? (да/нет): ").lower()
    if choice in ['да', 'y']:
        print("🚦 Зелёный свет: дорога свободна!")
        break
    elif choice in ['нет', 'n']:
        print("🚦 Красный свет: процесс прерван.")
        break
    else:
        print("⚠️ Ошибка! Укажите 'да' или 'нет'.")
Управление потоком выполнения здесь реализовано на базе подхода, аналогичного принципам организации дорожного движения.
Обработка крайних случаев
Результативный код должен предусматривать аномальные вводы. Вот несколько примеров:
- Пользователь вводит что-то иное не 'да' или 'нет'.
 - Пользователь нажимает Enter, не вводя никаких данных.
 - Пользователь использует 'YES' вместо 'да'.
 
Обработка таких случаев делает код более устойчивым и приветливым для пользователя.
Обеспечение высококачественной обратной связи
Создание понятных сообщений об ошибках помогает улучшить взаимодействие с пользователем:
while True:
    choice = input("Продолжить? (да/нет): ").lower()
    if choice in ['да', 'y', '']:
        print("🚦 Зелёный свет: процесс продолжается.")
        break
    elif choice in ['нет', 'n']:
        print("🚦 Красный свет: процесс прерван.")
        break
    else:
        print("💡 Попробуйте ввести 'да' или 'нет'.")
Такого рода сообщения ориентируют пользователя и способствуют корректному вводу.
Время для абстракции?
Если в коде часто применяется запрос подтверждения, может быть полезно вынести его в отдельный модуль.
Полезные материалы
- Встроенные функции — Документация Python 3.12.2
 - Python Prompt Toolkit 3.0 — документация prompt_toolkit 3.0.43
 - Создание интерфейсов командной строки с помощью argparse – Real Python
 - argparse — документация Python 3.12.2
 - Добро пожаловать в Click — Документация Click (7.x)
 - docopt—язык для описания интерфейсов командной строки
 - Программирование с использованием curses в Python — Документация Python 3.12.2
 


