Флаги вводимых команд¶
Флаги — это специальные параметры, которые пользователь может добавлять к командам для управления их поведением.
Зачем нужны флаги в командах¶
Управление поведением команды¶
Основная цель флагов — предоставить способ изменить логику работы команды без её переработки. Команда может работать в нескольких режимах: стандартном, подробном, отладочном или упрощённом. Флаги переключают эти режимы по требованию пользователя, оставляя основную функциональность неизменной.
Опциональность и удобство¶
Флаги решают проблему обязательности параметров. Если все параметры команды сделать обязательными, это затруднит использование команды. Флаги же позволяют задать значения только необходимые в конкретной ситуации, остальные используют значения по умолчанию.
Когда могут понадобиться флаги¶
- Переключение режимов работы
Команда выполняет развёртывание приложения обычно, но нужен режим без фактического развёртывания (dry-run) для проверки. Флаг
--dry-runпереключит режим работы.- Настройка уровня детальности
При отладке или анализе требуется больше информации о процессе выполнения команды. Флаги
--verboseили--debugпредоставляют подробный вывод.- Управление поведением при ошибках
По умолчанию команда может прерваться при первой ошибке. Флаг
--forceпозволит продолжить работу, пропуская некритичные ошибки.- Форматирование вывода
Команда выводит данные текстом, но в некоторых сценариях нужен JSON или CSV. Флаг
--format=jsonпереключит формат вывода.- Комбинирование опций
Часто нужна комбинация нескольких изменений: подробный вывод, dry-run режим и JSON формат. Несколько флагов решают эту задачу одновременно.
Практическое значение¶
Флаги делают команды более предсказуемыми и контролируемыми. Пользователь может начать с простого использования, а затем добавлять флаги по мере необходимости. Это особенно важно при автоматизации задач в скриптах, где гибкость интерфейса критична.
Флаги также облегчают интеграцию команд в различные системы, так как дополнительное поведение достигается без изменения структуры команды, а только через передачу опциональных параметров.
Синтаксис флагов¶
Общий синтаксис выглядит так:
<command_name> <flag_prefix: Literal['-', '--', '---']><flag_name> <flag_value: Optional>
Флаг состоит из префикса (-, -- или ---), имени и, опционально, значения, которое указывается через пробел.
Примеры:
greet --name John
deploy --verbose
backup -f --compress
Работа с флагами в обработчиках¶
Чтобы получить значение флага в обработчике, используйте объект response.input_flags типа InputFlags.
Пример с флагом, имеющим значение:
1from argenta import Router, Response
2from argenta.command import Command, Flag
3
4router = Router()
5
6
7@router.command(Command("greet", flags=Flag("name")))
8def greet_handler(response: Response):
9 # Get flag by name
10 name_flag = response.input_flags.get_flag_by_name("name")
11
12 # Check if flag was passed
13 if name_flag:
14 print(f"Hello, {name_flag.input_value}!")
15 else:
16 print("Hello, stranger!")
Пример с флагом-переключателем:
1from argenta import Router, Response
2from argenta.command import Command, Flag, PossibleValues
3from argenta.command.flag import ValidationStatus
4
5router = Router()
6
7
8@router.command(Command("deploy", flags=Flag("verbose", possible_values=PossibleValues.NEITHER)))
9def deploy_handler(response: Response):
10 # Check for toggle flag presence
11 verbose_flag = response.input_flags.get_flag_by_name("verbose")
12
13 if verbose_flag and verbose_flag.status == ValidationStatus.VALID:
14 print("Deploying with verbose output...")
15 # Detailed logic
16 elif verbose_flag and verbose_flag.status == ValidationStatus.INVALID:
17 print("Incorrect flag value")
18 return
19 else:
20 print("Deploying...")
21 # Normal logic
См. также
Подробнее о работе с объектом InputFlags см. в разделе InputFlags.
Два типа флагов¶
Флаги бывают двух основных видов:
Флаги со значениями — принимают параметр после имени флага (например,
--name John,--port 8080)Флаги-переключатели — не принимают значения, их наличие само по себе является сигналом (например,
--verbose,--force)
Argenta позволяет регистрировать и вводить флаги обоих типов в любой последовательности для одной команды.
Примечание
Ошибки валидации не выбрасывают исключений. Вместо этого у каждого объекта InputFlag есть атрибут status, по которому можно определить, прошла ли валидация успешно. Подробное описание API для создания флагов находится в разделе Flag.
При регистрации флага можно задать правила валидации для его значения. По умолчанию любое значение считается корректным. Валидацию можно настроить несколькими способами:
Флаги против аргументов¶
В контексте Argenta флаги и аргументы относятся к разным уровням взаимодействия с приложением.
Аргументы — это параметры, передаваемые при запуске приложения. Они определяют глобальную конфигурацию на протяжении всей его работы (например, адрес базы данных, уровень логирования).
Флаги — это параметры командных операций, доступные в рамках интерактивной сессии при вводе каждой новой команды. Они позволяют модифицировать поведение конкретной команды без перезагрузки приложения.
См. также
API и более подробное описание в разделе Flag.
Ключевые различия¶
- Время жизни
Аргументы передаются один раз при запуске и действуют на весь период работы приложения. Флаги локальны и существуют только в рамках выполнения команды.
- Изменяемость
Для изменения аргументов необходимо перезапустить приложение. Флаги можно менять при каждом вводе команды.
- Назначение
Аргументы управляют глобальной конфигурацией приложения. Флаги управляют поведением отдельных команд.
Практические примеры¶
Аргументы при запуске приложения:
Адрес подключения к базе данных
Режим работы (production, development, testing)
Уровень логирования
Флаги в интерактивной сессии:
deploy --verbose --dry-run— для команды развёртыванияbackup --compress --encrypted— для команды резервного копированияtest --parallel --coverage— для команды тестирования