Можно ли анализировать параметры только одной группы аргументов с помощью argparse?

Я хочу сделать что-то вроде этого:

parser = argparse.ArgumentParser()

group1 = parser.add_argument_group('group1')
group1.add_argument('--test1', help="test1")

group2 = parser.add_argument_group('group2')
group2.add_argument('--test2', help="test2")

group1_args = group1.parse_args()
group2_args = group2.parse_args()

Однако я получаю следующую ошибку:

Traceback (most recent call last):
  File "test.py", line 19, in <module>
    group1_args = group1.parse_args()
AttributeError: '_ArgumentGroup' object has no attribute 'parse_args'

Есть ли способ получить аргументы только для одной группы аргументов?

1 ответ

Решение

Как указывает ваше сообщение об ошибке, ArgumentGroup не является синтаксическим анализатором, в частности он не имеет parse_args метод.

Объекты ArgumentParser и объекты ArgumentGroup совместно используют базовый класс ArgumentContainer, который дает им такие методы, как add_argument, Но ArgumentParser имеет много дополнительного кода. ArgumentGroup действительно просто помощь в форматировании help, Это никак не влияет на разбор.

Чтобы добавить путаницу, mutually_exclusive_group подклассы ArgumentGroup, но влияет только на usage часть helpи влияет на синтаксический анализ, вызывая сообщение об ошибке.

Если вы уточните, почему вы хотите это сделать, мы могли бы предложить некоторые альтернативы, которые могут сработать. Например, есть parents механизм, который позволяет вам insert один parser в другое. Или же subparsers которые передают управление синтаксическому анализу подпарсеру через аргументы 'command'.


https://docs.python.org/3/library/argparse.html

Определение каждой группы по-своему parent parser, позволит вам управлять как отображением справки, так и анализом. Единственная проблема с родителями в том, что вы должны использовать help=False на каком-то уровне, чтобы предотвратить дублирование -h вариант.

Вам также может понадобиться parse_known_args так что парсер 'group' не жалуется на аргументы, которые он не распознает.


Вот способ отображения всех args записи, сгруппированные по аргументам group. Я включаю 2 группы по умолчанию, опционные и позиционные. Он использует "приватные" атрибуты парсера. В этом есть небольшой риск, но это не та вещь, которая может измениться в будущих патчах.

import argparse
parser = argparse.ArgumentParser()

group1 = parser.add_argument_group('group1')
group1.add_argument('--test1', help="test1")

group2 = parser.add_argument_group('group2')
group2.add_argument('--test2', help="test2")

args = parser.parse_args('--test1 one --test2 two'.split())

print([g.title for g in parser._action_groups])  # all group titles
print(group1._group_actions)  # arguments/actions of `group1`
print([a.dest for a in group2._group_actions]) # actions for group2

for group in parser._action_groups:
    group_dict={a.dest:getattr(args,a.dest,None) for a in group._group_actions}
    print(group.title, argparse.Namespace(**group_dict))

производства

1513:~/mypy$ python stack31519997.py 
['positional arguments', 'optional arguments', 'group1', 'group2']
[_StoreAction(option_strings=['--test1'], dest='test1', nargs=None, const=None, default=None, type=None, choices=None, help='test1', metavar=None)]
['test2']
('positional arguments', Namespace())
('optional arguments', Namespace(help=None))
('group1', Namespace(test1='one'))
('group2', Namespace(test2='two'))

Если бы было удобнее работать с vars(args), словарь версия. argparse.Namespace(**adict) воссоздает пространство имен из словаря.

Из грубого ты делаешь свой dest списки, ['test1'] а также ['test2'],

Другие вопросы по тегам