es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

argparse: no se puede obtener el nombre del subpaseador después de declarar un argumento global.

Tengo un analizador sintáctico con algunos subanalizadores. Configuré un argumento global para ser utilizado en todos los subanalizadores. Aquí está el fragmento relevante:

parser = argparse.ArgumentParser(prog="my_prog", add_help=False)
parser.add_argument('-d', '--debug', action='store_true', help='debug flag')

subparsers = parser.add_subparsers(dest="subparser_name", help='some help notes')

parser_cmd1 = subparsers.add_parser('cmd1', parents=[parser])
parser_cmd1.add_argument('-f', '-foo', type=str, action=foo, required=False, help='foo command')

parser_cmd2 = subparsers.add_parser('cmd2', parents=[parser])
parser_cmd2.add_argument('-b', '-bar', type=str, action=bar, required=False, help='bar command')

args = parser.parse_args()
parser = args.subparser_name

print(args)

if args.debug:
    logging.basicConfig(level=logging.INFO)

if parser == 'cmd1':
    if args.foo:
        //do foo stuff

if parser == 'cmd2':
    if args.bar:
        //do bar stuff

Así que puedes usar un comando como tal my_prog.py cmd1 -d -f input_str. Aquí está el problema: subparser_name es Nulo. La salida de print(args) se ve algo así:

Namespace(debug=True, foo="input_str", subparser_name=None)

Antes de agregar el argumento global de depuración, subparser_name sería el nombre del comando que ejecuté, es decir, ‘cmd1’ o ‘cmd2’. Ahora, es ‘None’. Incluso con la adición de parents=[parser] en la creación del subanalizador. ¿Cómo puedo arreglar esto? ¿Cómo sé qué comando se llamó?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema está con el orden de análisis de los argumentos. Ya que el argumento global se agrega antes de la creación de los subparsers, se analiza antes de que se determine el subparser_name. Para solucionar esto, el argumento global debería agregarse después de la creación de los subparsers como se muestra a continuación:

    subparsers =  parser.add_subparsers(dest="subparser_name", help='algunas notas de ayuda')
    
    parser_cmd1 = subparsers.add_parser('cmd1')
    parser_cmd1.add_argument('-f', '--foo', type=str, action=foo, required=False, help='comando foo')
    
    parser_cmd2 = subparsers.add_parser('cmd2')
    parser_cmd2.add_argument('-b', '--bar', type=str, action=bar, required=False, help='comando bar')
    
    parser.add_argument('-d', '--debug', action='store_true', help='indicador de depuración')
    
    args = parser.parse_args()
    
    parser = args.subparser_name
    
    if args.debug:
        logging.basicConfig(level=logging.INFO)
    
    if parser == 'cmd1':
        if args.foo:
            # hacer cosas con foo
    
    if parser == 'cmd2':
        if args.bar:
            # hacer cosas con bar
    

    Ahora, el subparser_name debería analizarse correctamente y mostrarse en la salida de print(args).

Comments are closed.