Обработка yes/no ввода в Python: подобно APT interface

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для имитации запроса подтверждения действия, аналогичного APT, можно применить функцию input(), в связке с циклом while:

Python
Скопировать код
choice = input("Продолжить? [y/n]: ").lower()
while choice not in ['y', 'n']:
    choice = input("Неверный ввод. Введите 'y' или 'n': ").lower()
if choice == 'y':
    print("Процесс продолжается...")
else:
    print("Остановлен.")

Данный скрипт служит эффективным инструментом для интерактивного запроса у пользователя о продолжении работы программы.

Кинга Идем в IT: пошаговый план для смены профессии

Изучение темы

Качество пользовательского опыта при работе с CLI-приложениями зависит от учета возможного поведения пользователя и создания интуитивно понятного интерфейса. Перейдем к обсуждению полезных подходов для улучшения вашего кода.

Просто нажмите Enter: strtobool

Функция strtobool из модуля Python 'distutils.util' – отличный инструмент для воссоздания функциональности APT, когда нажатие Enter интерпретируется как согласие:

Python
Скопировать код
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:

Python
Скопировать код
import click

if click.confirm('Вы хотите продолжить?', default=True):
    print('Процесс продолжается...')
else:
    print('Прервано.')

Функция confirm() из библиотеки Click обеспечивает ясность и понятность кода, а также его совместимость с разными ОС.

Превращение скрипта в модуль

Модульность упрощает поддержку и расширение кода. Оформим запрос подтверждения в виде функции:

Python
Скопировать код
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 напоминает управление движением на дороге:

Markdown
Скопировать код
**Ваш код:**

Продолжить? ➡️ [Yes] или [No]?

**Python**
Python
Скопировать код
while True:
    choice = input("Продолжить? (да/нет): ").lower()
    if choice in ['да', 'y']:
        print("🚦 Зелёный свет: дорога свободна!")
        break
    elif choice in ['нет', 'n']:
        print("🚦 Красный свет: процесс прерван.")
        break
    else:
        print("⚠️ Ошибка! Укажите 'да' или 'нет'.")

Управление потоком выполнения здесь реализовано на базе подхода, аналогичного принципам организации дорожного движения.

Обработка крайних случаев

Результативный код должен предусматривать аномальные вводы. Вот несколько примеров:

  • Пользователь вводит что-то иное не 'да' или 'нет'.
  • Пользователь нажимает Enter, не вводя никаких данных.
  • Пользователь использует 'YES' вместо 'да'.

Обработка таких случаев делает код более устойчивым и приветливым для пользователя.

Обеспечение высококачественной обратной связи

Создание понятных сообщений об ошибках помогает улучшить взаимодействие с пользователем:

Python
Скопировать код
while True:
    choice = input("Продолжить? (да/нет): ").lower()
    if choice in ['да', 'y', '']:
        print("🚦 Зелёный свет: процесс продолжается.")
        break
    elif choice in ['нет', 'n']:
        print("🚦 Красный свет: процесс прерван.")
        break
    else:
        print("💡 Попробуйте ввести 'да' или 'нет'.")

Такого рода сообщения ориентируют пользователя и способствуют корректному вводу.

Время для абстракции?

Если в коде часто применяется запрос подтверждения, может быть полезно вынести его в отдельный модуль.

Полезные материалы

  1. Встроенные функции — Документация Python 3.12.2
  2. Python Prompt Toolkit 3.0 — документация prompt_toolkit 3.0.43
  3. Создание интерфейсов командной строки с помощью argparse – Real Python
  4. argparse — документация Python 3.12.2
  5. Добро пожаловать в Click — Документация Click (7.x)
  6. docopt—язык для описания интерфейсов командной строки
  7. Программирование с использованием curses в Python — Документация Python 3.12.2