Можно ли сказать, что argparse в python 2.7 требует минимум ДВУХ аргументов? - PullRequest
5 голосов
/ 07 декабря 2011

Мое приложение - это специализированная утилита сравнения файлов, и, очевидно, нет смысла сравнивать только один файл, поэтому nargs='+' не совсем уместно.

nargs=N только максимальное значение Nаргументы, но мне нужно принять бесконечное количество аргументов, если их хотя бы два.

Ответы [ 2 ]

18 голосов
/ 07 декабря 2011

Короткий ответ: вы не можете этого сделать, потому что nargs не поддерживает что-то вроде '2 +'.

Длинный ответ: вы можете обойти это, используя что-то вроде этого:

parser = argparse.ArgumentParser(usage='%(prog)s [-h] file file [file ...]')
parser.add_argument('file1', nargs=1, metavar='file')
parser.add_argument('file2', nargs='+', metavar='file', help=argparse.SUPPRESS)
namespace = parser.parse_args()
namespace.file = namespace.file1 + namespace.file2

Трюки, которые вам нужны:

  • Используйте usage, чтобы предоставить собственную строку использования для анализатора
  • Используйте metavar, чтобы отобразить аргумент с другим именем встрока справки
  • Используйте SUPPRESS, чтобы избежать отображения справки для одной из переменных
  • Объедините две разные переменные, просто добавив новый атрибут в объект Namespace, который анализатор возвращает

В приведенном выше примере выдается следующая строка справки:

usage: test.py [-h] file file [file ...]

positional arguments:
  file

optional arguments:
  -h, --help  show this help message and exit

, и она все равно не будет выполнена, если передано менее двух аргументов:

$ python test.py arg
usage: test.py [-h] file file [file ...]
test.py: error: too few arguments
6 голосов
/ 07 декабря 2011

Не могли бы вы сделать что-то вроде этого:

import argparse

parser = argparse.ArgumentParser(description = "Compare files")
parser.add_argument('first', help="the first file")
parser.add_argument('other', nargs='+', help="the other files")

args = parser.parse_args()
print args

Когда я запускаю это с -h, я получаю:

usage: script.py [-h] first other [other ...]

Compare files

positional arguments:
  first       the first file
  other       the other files

optional arguments:
  -h, --help  show this help message and exit

Когда я запускаю его только с одним аргументом, он не будет работать:

usage: script.py [-h] first other [other ...]
script.py: error: too few arguments

Но два или более аргумента в порядке. С тремя аргументами он печатает:

Namespace(first='one', other=['two', 'three'])
...