Можно ли сказать, что argparse в python 2.7 требует как минимум ДВА аргумента?

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

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


person Bryan Dunphy    schedule 07.12.2011    source источник
comment
Также взгляните на stackoverflow.com/questions/4194948/. Это обеспечивает еще большую гибкость, не искажая (или возясь) с текстом справки.   -  person    schedule 21.05.2013


Ответы (2)


Короткий ответ: вы не можете этого сделать, потому что 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
person jcollado    schedule 07.12.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'])
person srgerg    schedule 07.12.2011