Обработка 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