Код: Выделить всё
tesy.py [-h] [-a [-b]]
То есть следующие синаксы верны
Код: Выделить всё
test.py
test.py -h
test.py -a
test.py -a -b
Код: Выделить всё
test.py -b
Можно ли это сделать с помощью argparse элегантным способом?
Очевидный способ не работает:
Код: Выделить всё
from argparse import ArgumentParser
parser = ArgumentParser(description='Test script')
parser.add_argument('-a', action='store_true')
parser.add_argument('-b', action='store_true')
args = parser.parse_args()
Код: Выделить всё
from argparse import ArgumentParser
parser = ArgumentParser(description='Test script')
parser.add_argument('-a', action='store_true')
parser.add_argument('-b', action='store_true')
args = parser.parse_args()
if args.b and not args.a:
parser.error('Option -b requires option -a.')
Или я мог бы использовать какую-нибудь хитрость (спасибо, ChatGPT), например:
< pre class="lang-py Prettyprint-override">
Код: Выделить всё
from argparse import ArgumentParser
parser = ArgumentParser(description='Test script')
parser.add_argument('-a', action='store_true')
args, unknown = parser.parse_known_args()
if args.a:
parser.add_argument('-b', action='store_true')
args = parser.parse_args()
else:
args = parser.parse_args(unknown)
Код: Выделить всё
test.py -hЯ не могу использовать суб- парсер, потому что он работает только с позиционными аргументами - не с опциями.
Может быть, то, что я хочу, можно сделать с помощью docopt, но обработка командной строки моего сценария уже построена на argparse, и я бы предпочел не нужно это переписывать.
Итак, есть ли элегантный способ сделать то, что я хочу, с помощью argparse? Или мне просто проглотить свою гордость и использовать один из неуклюжих?
Подробнее здесь: https://stackoverflow.com/questions/793 ... on-is-used
Мобильная версия