Обработка (возможно) необязательных аргументов в Python - PullRequest
1 голос
/ 28 ноября 2009

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

  1. Если адрес сервера указан в командной строке, используйте это и игнорируйте любые другие значения
  2. Если адрес сервера не указан в командной строке, но находится в файле конфигурации, указанном в командной строке, используйте этот адрес. Игнорировать любые другие значения.
  3. Если адрес сервера не указан в командной строке или в файле конфигурации, указанном в команде, но доступен в файле конфигурации в домашнем каталоге пользователя (скажем, .myapprc ), используйте это значение.
  4. Если адрес сервера не указан ни в одном из вышеперечисленных механизмов, выйдите с сообщением об ошибке.

Наиболее близким к этому я видел модуль configparse , который, насколько я могу судить, предлагает парсер опций, который также просматривает файлы конфигурации, но, похоже, не имеет понятия " Должно быть указано где-то ", что мне нужно.

Кто-нибудь знает о существующем модуле, который может покрыть мой пример использования выше? Если нет, то было бы очень признательно за простое расширение для optparse, configparse или какого-либо другого модуля, который я не рассматривал.

Ответы [ 3 ]

1 голос
/ 28 ноября 2009

Этот сторонний модуль configparse написан для расширения optparse из стандартной библиотеки Python. Как я уже упоминал в документах optparse, «optparse не мешает вам реализовать требуемые опции, но и не дает вам большой помощи в этом» (хотя далее следует пара URL-адресов, которые показывают вам способы сделать это) , Простейшим является использование функциональности default value : укажите значение по умолчанию, которое на самом деле не является допустимым значением (для чего-то вроде адреса сервера, это довольно просто) - затем, после обработки параметров, убедитесь, что указанное значение допустимо (что в любом случае является хорошей идеей!) и в противном случае выдает соответствующее исключение.

0 голосов
/ 28 ноября 2009

используйте dict для сохранения параметров вашей программы.

Сначала проанализируйте файл опций в каталоге пользователя и сохраните все опции в dict (configparse или любой другой модуль приветствуется). затем проанализируйте командную строку (используя любой модуль, который вы хотите, optparse может подойти хорошо), если аргументы задают файл конфигурации, проанализируйте указанный файл в dict и обновите ваши параметры из того, что вы прочитали (dict.update действительно удобно для слияния 2 дикта). затем сохраните все остальные аргументы в другой dict и снова объедините их (dict.update снова ...).

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

0 голосов
/ 28 ноября 2009

Я использовал функцию промежуточного программного обеспечения opster вместе с SafeConfigParser для достижения аналогичного (но немного более простого) эффекта, как вы просите. Вы должны реализовать конкретную логику, которую вы описали сами, но она помогает вам достаточно, чтобы сделать ее относительно безболезненной. Пример использования промежуточного программного обеспечения opster приведен в примере test / test.py .

...