Технологии / Программирование / Python

Python argparse - эквивалент Perl Getopt

Малоизвестные приемы использования Python argparse

Я эксперт по Perl. Следовательно, я много лет использовал модуль Perl Getopt :: Long.

Примерно 2 года назад моя организация решила использовать Python. Когда я начал разрабатывать инструменты и автоматизацию на Python, мне нужен был модуль Python, который предоставлял бы функции, аналогичные Getopt :: Long в Perl.

Поскольку я искал нечто подобное, я нашел модуль Python getopt. Но он очень ограничен в своей функциональности и не интуитивно понятен. Его использование приводит к появлению слишком большого количества ненужного кода.

К счастью, документация по getopt начинается с примечания, в котором читателю предлагается рассмотреть модуль argparse. Я так рад, что обратил внимание на эту заметку, которая гласит:

Note
The getopt module is a parser for command line options whose API is designed to be familiar to users of the C getopt() function. Users who are unfamiliar with the C getopt() function or who would like to write less code and get better help and error messages should consider using the argparse module instead.

В конце концов Perl также придумал Getopt :: ArgParser, вдохновленный argparse Python. Но это уже для другой статьи.

Документация argparse очень хороша. Фактически, доступны две документации:

  1. Нежное введение в argparse: руководство по argparse
  2. Справочник по API: библиотека argparse

Подробное изучение двух вышеупомянутых документов, безусловно, поможет вам освоиться с использованием модуля argparse в Python.

На высоком уровне вы делаете 3 шага для анализа аргументов командной строки:

  1. Создайте объект ArgumentParser.
  2. Добавьте аргументы к объекту с помощью метода add_argument ().
  3. Разберите аргументы с помощью метода parse_args ().

Чтобы реализовать несколько различных вариантов использования аргументов командной строки, argparse уже предоставляет массу интересных опций, таких как:

  • Позиционные аргументы
  • Необязательные аргументы
  • Комбинирование позиционных и необязательных аргументов
  • Короткие и длинные варианты
  • Взаимоисключающие варианты
  • Простое использование / реализация справочного сообщения
  • Различные типы значений аргумента
  • Различные действия для аргументов
  • Различное количество значений аргументов
  • Различные фиксированные варианты выбора в качестве значений аргумента
  • Значение по умолчанию для аргумента
  • Так далее…

Ссылки на документацию, приведенные выше, подробно объясняют эти параметры, и поэтому я не собираюсь повторять их здесь.

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

Позвольте мне поделиться некоторыми из этих приемов, которым я научился на своем опыте использования argparse. Большинство из них не может быть легко вывести из документации.

Ввод без учета регистра

Чтобы преобразовать значение аргумента командной строки в верхний регистр, просто укажите тип как «str.upper». Вы даже можете передать вызываемую (функцию) в качестве значения для типа. Затем этот вызываемый объект будет вызываться со значением в качестве аргумента.

Варианты и значение по умолчанию для него

Сценарий и решение:

  • Необязательный аргумент командной строки - отсюда "--perform"
  • Имея значение из набора вариантов - отсюда choices=[“SING”, “ACT”, “DANCE”, “ALL”]
  • Если значение не указано (но указан аргумент командной строки), выберите значение по умолчанию «ВСЕ» - отсюда nargs=’?’, const=’ALL’

Зависимые аргументы командной строки

Вы когда-нибудь сталкивались со сценарием, когда один аргумент командной строки имеет смысл ТОЛЬКО ЕСЛИ выбран другой аргумент командной строки?

Что ж, это можно реализовать с помощью параметра required метода add_argument ().

В приведенном ниже фрагменте кода, если выбрано -d, обязательно выбрать опцию -p.

1 аргумент 3-в-1 значения

Представьте себе сценарий, в котором, если аргумент командной строки не выбран, должно быть выполнено действие 1, а если аргумент выбран, но значение не указано, тогда действие 2 имеет и, наконец, если аргумент выбран и указано значение, должно быть выполнено действие 3.

Например, если -p не выбрано, тогда «Воспроизвести инструментальную»; если выбрано -p, но значение не указано, то «Играть Backstreet Boys»; а если выбрано -p и указано значение, то «Воспроизвести‹ предоставленный альбом ›».

Приведенный выше пример и фрагмент кода также объясняют разницу между const и default, когда nargs=’?’.

С какими еще интересными вариантами использования вы столкнулись и какое решение вы использовали для их реализации?