¿Es posible analizar solo los parámetros de un grupo de argumentos con argparse?

Estoy buscando hacer algo como esto:

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() 

Sin embargo, estoy recibiendo el siguiente error:

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

¿Hay una manera de obtener solo los argumentos para un grupo de argumentos?

Como indica su mensaje de error, un ArgumentGroup no es un analizador, específicamente no tiene el método parse_args .

Los objetos ArgumentParser y los objetos ArgumentGroup comparten una clase ArgumentContainer base que les proporciona métodos como add_argument . Pero un ArgumentParser tiene un montón de código adicional. Un ArgumentGroup es realmente una ayuda para formatear la help . No afecta el análisis de ninguna manera.

Para agregar confusión, mutually_exclusive_group genera una mutually_exclusive_group grupal_exclusiva ArgumentGroup , pero afecta solo la parte de usage de la help , y afecta el análisis al generar un mensaje de error.

Si explica por qué quiere hacer esto, podríamos encontrar algunas alternativas que podrían funcionar. Por ejemplo, hay un mecanismo de parents , que le permite insert un parser en otro. O subparsers que pasan el control de análisis a subparsers a través de los argumentos de “comando”.


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

Definir cada grupo en su propio analizador parent , le permitiría controlar tanto la visualización de la ayuda como el análisis. El único problema con los padres es que tiene que usar help=False en algún nivel para evitar la duplicación de la opción -h .

También es posible que necesite usar parse_known_args para que el analizador ‘grupo’ no se queje por los argumentos que no reconoce.


Aquí hay una forma de mostrar todas las entradas de argumentos, agrupadas por grupo de argumentos. Estoy incluyendo los 2 grupos predeterminados, opcionales y posicionales. Hace uso de atributos “privados” del analizador. Hay un poco de riesgo al hacerlo, pero este no es el tipo de cosa que probablemente se cambiará en parches futuros.

 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)) 

productor

 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')) 

Si pudiera ser más conveniente trabajar con vars(args) , la versión del diccionario. argparse.Namespace(**adict) recrea un espacio de nombres de un diccionario.

De grueso, usted hace sus propias listas de dest , ['test1'] y ['test2'] .