Какой интерфейс рекомендуется использовать для утилиты, требующей много параметров?

Какой интерфейс рекомендуется использовать для утилиты, требующей много параметров?

Я создаю утилиту командной строки, которая требует шесть фрагментов информации для корректной работы. Выглядит это так:

fm-git filename repository path comment username password

Однако в любой индивидуальной системе usernameи passwordбудет постоянным.

При запуске утилиты мне сложно ее построить. Например, вот один тестовый вызов утилиты (разбит на несколько строк для удобства чтения):

/Users/chuck/Projects/fm-git/fm-git.py chiv-lib
/Users/chuck/Projects/chiv-lib/ Chivalry/ "continued testing"
Administrator abc1234

Я рассматриваю разные способы передачи этих аргументов. Например, fm-git -f filename -r repository ...или fm-git --filename filename --repository repository.... Я также рассматриваю возможность создания параметров конфигурации аргументов usernameи password, поскольку они, как правило, не меняются, и их можно было бы исключить из вызова утилиты.

Когда аргументов утилиты много, но они необходимы, какова общепринятая практика поддержания читабельности вызова утилиты?

решение1

Обычно приложения Unix допускают несколько способов предоставления этой информации, при этом более «конкретные» способы переопределяют менее конкретные.

Так что у тебя есть:

  • Для графических приложений используемый инструментарий почти всегда предоставляет какой-либо способ получить ресурс (например, xrdb-style в простом X и т. д.)

  • файл конфигурации, если инструментарий его еще не предоставляет.

  • параметры командной строки, как краткие, так и длинные (легко использовать getoptв C)

  • разумные значения по умолчанию, если не указано никакой информации, например, текущий каталог для пути

Позиционные параметры имеют смысл только для нескольких обязательных, за которыми, возможно, следует список файлов (потому что спецификации wildcard расширяются до нескольких параметров). Шесть отдельных частей — это слишком много; порядок трудно запомнить, поэтому используйте для них параметры.

Для паролей может быть полезно предоставить способ заставить приложение считывать пароль из stdin, возможно, используя специальное значение (например, --password -или -p -).

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

решение2

В целом, хорошей идеей будет:

  1. вычислять зависимые аргументы, но разрешать переопределять их: например, в вашем примере у вас filenameто же самое, что и $(basename repository), поэтому вам может потребоваться только репозиторий, но есть возможность --filenameуказать альтернативное имя файла.
  2. скрыть auth из командной строки и psвывода. Поместите их в какой-нибудь файл: может быть $HOME/.fm-git.conf, дайте файлу больше ограничений, например, chmod 600 $HOME/.fm-git.confи прочитайте их из файла. Иногда также есть возможность получить имя пользователя и пароль из переменных окружения (например, имя пользователя по умолчанию — это ваше системное имя пользователя или SUDO_USER), но, возможно, это не ваш случай.

Итак, после этих двух оптимизаций у вас есть только 3 параметра cli, я думаю, это приемлемо. Можете свободно использовать их как позиционные параметры или предоставить некоторые флаги, например --comment: предоставление длинных флагов улучшит читаемость, если вы будете использовать свою программу в скриптах в дальнейшем, но потребует ввода большего количества текста, если вы будете запускать свою программу в основном вручную из cli.

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

Связанный контент