Это явно неудобная спецификация для argparse
, и я подозреваю большинство других парсеров POSIX.
Сканирование sys.argv
и настройка определения парсера является одним из возможных способов.
Другой способ заключается в использовании 2 стадии синтаксического анализа, с parse_known_args
:
import argparse
usage = 'prog [-h] [--simulation] [arg1 arg2 arg3 arg4]'
parser1 = argparse.ArgumentParser(usage=usage)
parser1.add_argument('--simulation', action='store_true')
# or omit the `store_true` if it just takes one argument
# other possible optionals
parser2 = argparse.ArgumentParser()
#parser2.add_argument("arg1", type = bool) # not a valid type parameter
parser2.add_argument("arg2")
parser2.add_argument("arg3", type = int)
parser2.add_argument("arg4")
# positionals are required, unless nargs=? or *
args, extras = parser1.parse_known_args()
if not args.simulation:
args = parser2.parse_args(extras, namespace=args)
elif extras:
parser1.error('cannot use --simulation with args')
print(args)
Возможные трассы включают в себя:
1526:~/mypy$ python stack41556997.py -h
usage: prog [-h] [--simulation] [arg1 arg2 arg3 arg4]
optional arguments:
-h, --help show this help message and exit
--simulation
1526:~/mypy$ python stack41556997.py --simulation
Namespace(simulation=True)
1527:~/mypy$ python stack41556997.py 1 2 3
Namespace(arg2='1', arg3=2, arg4='3', simulation=False)
1527:~/mypy$ python stack41556997.py 1 2 3 --sim
usage: prog [-h] [--simulation] [arg1 arg2 arg3 arg4]
stack41556997.py: error: cannot use --simulation with args
Обратите внимание, что помощь не включает в себя оба набора. Я включил некоторую информацию в пользовательское использование, но нет линий помощи для arg#
. Создание хорошего сообщения help
будет неудобно с вашей спецификацией.
Я пропустил ваш arg1
. type=bool
недействителен аргумент type
. См. Мое объяснение по адресу Parsing boolean values with argparse
Я изменил --simulation
на store_true
, так как вы сказали, что не принимали никаких аргументов. Это нормальный способ принять True/False.
Subparsers часто является лучшим инструментом для принятия различных шаблонов аргументов. В этом случае у вас может быть один подпараметр, называемый «имитировать», который не требует каких-либо аргументов, а другой вызов «somethingelse», для которого требуются 4 позиции.
Я собирался предложить взаимную_exclusive_group с --simulation
и --other
опциями. Но аргумент store_true
не работает в такой группе.
=============
subparser маршрут:
parser = argparse.ArgumentParser()
sp = parser.add_subparsers(dest='cmd')
sp.add_parser('simulate')
parser2 = sp.add_parser('other')
parser2.add_argument("arg2")
parser2.add_argument("arg3", type = int)
parser2.add_argument("arg4")
print(parser.parse_args())
испытания:
1552:~/mypy$ python stack41556997.py -h
usage: stack41556997.py [-h] {simulate,other} ...
positional arguments:
{simulate,other}
optional arguments:
-h, --help show this help message and exit
1557:~/mypy$ python stack41556997.py simulate
Namespace(cmd='simulate')
1557:~/mypy$ python stack41556997.py other -h
usage: stack41556997.py other [-h] arg2 arg3 arg4
positional arguments:
arg2
arg3
arg4
optional arguments:
-h, --help show this help message and exit
1557:~/mypy$ python stack41556997.py other 1 2 3
Namespace(arg2='1', arg3=2, arg4='3', cmd='other')
Обратите внимание, что arg3
type
преобразовал вклад целое число. Остальные оставлены как строки. С помощью этой настройки args.cmd
будет именем подпараметра, не совсем то же самое, что и атрибут boolean args.simulation
.
==================
помеченном аргумент не-по умолчанию требуется. Позиционные аргументы требуются, если значение nargs
равно?? или '*'. Вы не можете указать «обязательный» параметр для позиционного.
Ваше использование 'type = bool' проблематично. См. Ссылку в моем ответе. – hpaulj