Обрабатывать опцию, только если используется другая опцияPython

Программы на Python
Ответить
Anonymous
 Обрабатывать опцию, только если используется другая опция

Сообщение Anonymous »

Мне нужно обработать параметры командной строки из моего скрипта Python, соответствующие синтаксису

Код: Выделить всё

tesy.py [-h] [-a [-b]]
(Это всего лишь упрощенный пример, иллюстрирующий проблему; на самом деле мой скрипт имеет множество других вариантов.)
То есть следующие синаксы верны

Код: Выделить всё

test.py
test.py -h
test.py -a
test.py -a -b
но следующий нет

Код: Выделить всё

test.py -b
потому что опция -a не указана.
Можно ли это сделать с помощью 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()
потому что он примет неверный синтаксис test.py -b. Теперь я мог бы вручную проверить, присутствует ли опция -a, когда задана опция -b, и в противном случае выдать ошибку:

Код: Выделить всё

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.')
но это несколько неэлегантно. Есть ли способ argparse обрабатывать синтаксис самостоятельно?
Или я мог бы использовать какую-нибудь хитрость (спасибо, 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
) вообще не упоминает опцию -b. Теоретически я мог бы переопределить текст справки, используя аргумент using= ArgumentParser, но это чревато ошибками — мой сценарий намного сложнее, чем этот упрощенный пример, имеет множество опций, но по-прежнему находится в стадии разработки, и если мне придется сохранить свой собственный текст использования, я могу забыть обновить его при добавлении, удалении или изменении параметра.
Я не могу использовать суб- парсер, потому что он работает только с позиционными аргументами - не с опциями.
Может быть, то, что я хочу, можно сделать с помощью docopt, но обработка командной строки моего сценария уже построена на argparse, и я бы предпочел не нужно это переписывать.
Итак, есть ли элегантный способ сделать то, что я хочу, с помощью argparse? Или мне просто проглотить свою гордость и использовать один из неуклюжих?

Подробнее здесь: https://stackoverflow.com/questions/793 ... on-is-used
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»