У меня есть один позиционный аргумент bar
и другой аргумент foo
, который анализирует список:
import argparse
p = argparse.ArgumentParser()
p.add_argument('-foo', nargs='+')
p.add_argument('bar')
Если bar
продолжается foo
, все отлично работает
print(p.parse_args('b -foo f1 f2 f3'.split()))
Это приводит к Namespace(bar='b', foo=['f1', 'f2', 'f3'])
.
Однако, если bar
после foo
, он жалуется, что bar
не предоставлено, то есть
print(p.parse_args('-foo f1 f2 f3 b'.split()))
вызывает
использование: main .py [-h] [-foo FOO [FOO ...]] бар main .py: ошибка: необходимы следующие аргументы: bar
Немного прискорбно, что подсказка об использовании фактически предлагает неправильный порядок.
На самом деле, я добавляю nargs='+'
к существующемусинтаксический анализатор для добавления функциональности, и где-то могут быть скрипты с «неправильным» порядком, то есть -foo
продолжается bar
.И я не хочу их ломать / исправлять.
Один из возможных способов - использовать вместо
p.add_argument('-foo', action='append')
Тогда команду нужно запустить с помощью
print(p.parse_args('-foo f1 -foo f2 -foo f3 b'.split()))
Это решает проблему, но немного многословно.Это лучшее, что можно сделать?