Подкоманды и параметры
Создавайте сложные CLI
«Подкоманды и параметры» — бесплатный урок Python Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.
Зачем нужны подкоманды?
У таких инструментов, как git, есть подкоманды: git add, git commit. argparse поддерживает их с помощью подпарсеров, у каждого из которых есть собственные аргументы.
import argparse
parser = argparse.ArgumentParser(prog='tool')
sub = parser.add_subparsers(dest='command')
print('subparsers ready')Добавление подпарсеров
add_subparsers возвращает объект, чей метод add_parser создаёт каждую подкоманду. Параметр dest сохраняет сведения о выбранной подкоманде.
import argparse
parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='command')
sub.add_parser('start')
sub.add_parser('stop')
args = parser.parse_args(['start'])
print('command:', args.command)Аргументы отдельных подкоманд
Каждый подпарсер может определять собственные аргументы. Подкоманда add в этом примере принимает имя, а list — ничего.
import argparse
parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='command')
p_add = sub.add_parser('add')
p_add.add_argument('name')
sub.add_parser('list')
args = parser.parse_args(['add', 'milk'])
print(args.command, args.name)Выбор действия по команде
После разбора аргументов проверьте args.command, чтобы запустить нужную логику.
import argparse
parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='command')
p_add = sub.add_parser('add')
p_add.add_argument('item')
sub.add_parser('clear')
args = parser.parse_args(['add', 'eggs'])
if args.command == 'add':
print('adding', args.item)
elif args.command == 'clear':
print('clearing all')Обработчики с set_defaults
Удобный подход — прикрепить функцию к каждому подпарсеру с помощью set_defaults(func=...), а затем вызвать args.func(args).
import argparse
def do_hi(args):
print('hi', args.who)
parser = argparse.ArgumentParser()
sub = parser.add_subparsers()
p = sub.add_parser('hi')
p.add_argument('who')
p.set_defaults(func=do_hi)
args = parser.parse_args(['hi', 'Ana'])
args.func(args)Общие параметры через родительские анализаторы
Родительский анализатор содержит параметры, общие для нескольких подкоманд, что позволяет избежать повторений. Передайте parents=[base] и add_help=False.
import argparse
base = argparse.ArgumentParser(add_help=False)
base.add_argument('--verbose', action='store_true')
parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='cmd')
sub.add_parser('run', parents=[base])
args = parser.parse_args(['run', '--verbose'])
print(args.cmd, args.verbose)Значения по умолчанию для каждого параметра
Параметры подкоманд могут иметь собственные значения по умолчанию и типы, как и аргументы верхнего уровня.
import argparse
parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='cmd')
p = sub.add_parser('scale')
p.add_argument('--factor', type=float, default=1.0)
args = parser.parse_args(['scale'])
print('factor:', args.factor)Добавление повторяющихся параметров
action='append' позволяет указывать флаг несколько раз, собирая каждое значение в список.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--tag', action='append', default=[])
args = parser.parse_args(['--tag', 'a', '--tag', 'b'])
print(args.tag)Подсчёт флагов
action='count' подсчитывает, сколько раз встречается флаг; это классический шаблон повышения подробности вывода с помощью -vvv.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-v', action='count', default=0)
args = parser.parse_args(['-v', '-v', '-v'])
print('verbosity level:', args.v)Инструмент с двумя командами
Объединение подкоманд, обработчиков и общих параметров даёт структурированный CLI с несколькими командами.
import argparse
def add(args):
print('add', args.item, 'qty', args.qty)
def remove(args):
print('remove', args.item)
parser = argparse.ArgumentParser()
sub = parser.add_subparsers()
pa = sub.add_parser('add')
pa.add_argument('item')
pa.add_argument('--qty', type=int, default=1)
pa.set_defaults(func=add)
pr = sub.add_parser('remove')
pr.add_argument('item')
pr.set_defaults(func=remove)
args = parser.parse_args(['add', 'pen', '--qty', '3'])
args.func(args)Обязательная подкоманда
Установите required=True для подпарсеров, чтобы пользователь был обязан выбрать команду; в противном случае argparse завершится с ошибкой.
import argparse
parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest='cmd', required=True)
sub.add_parser('go')
args = parser.parse_args(['go'])
print('chosen:', args.cmd)Быстрая проверка
Проверьте своё понимание подкоманд и параметров.
Итоги
Вы изучили подкоманды и параметры:
add_subparsersиadd_parserсоздают инструменты с несколькими командами.set_defaults(func=...)передаёт выполнение обработчикам.- Родительские анализаторы позволяют совместно использовать общие параметры.
- Действия
appendиcountобрабатывают повторяющиеся флаги.
Далее: библиотека Click для создания CLI на основе декораторов.
Часто задаваемые вопросы
Урок «Подкоманды и параметры» бесплатный?
Да — полный текст урока «Подкоманды и параметры» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.
Чему я научусь в уроке «Подкоманды и параметры»?
Создавайте сложные CLI Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Python Academy?
Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Подкоманды и параметры»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Python Academy?
Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы argparse
- Подкоманды и параметры
- Библиотека Click
- Расширенный вывод в терминале