Можно ли анализировать параметры только одной группы аргументов с помощью 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']
,