2011-09-21 12 views
39

Mi script define un analizador principal y múltiples subparsores. Deseo aplicar el argumento -p a algunos subparsores. Hasta ahora, el código es el siguiente:Python argparse - Agregar argumento a múltiples subparsers

parser = argparse.ArgumentParser(prog="myProg") 
subparsers = parser.add_subparsers(title="actions") 

parser.add_argument("-v", "--verbose", 
        action="store_true", 
        dest="VERBOSE", 
        help="run in verbose mode") 

parser_create = subparsers.add_parser ("create", 
             help = "create the orbix environment") 
parser_create.add_argument ("-p", 
          type = int, 
          required = True, 
          help = "set db parameter") 

# Update 
parser_update = subparsers.add_parser ("update", 
             help = "update the orbix environment") 
parser_update.add_argument ("-p", 
          type = int, 
          required = True, 
          help = "set db parameter") 

Como se puede ver la add_arument ("-p") se repite dos veces. De hecho, tengo muchos más subparsers. ¿Hay alguna manera de recorrer los subparsers existentes para evitar la repetición?

Para que conste, estoy usando Python 2.7

+0

relacionadas: http://stackoverflow.com/questions/14918804/how-to-show-help-for-all-subparsers-in-argparse –

Respuesta

52

Esto puede lograrse mediante la definición de un parent parser que contiene la opción (s) común:

[...] 
parent_parser = argparse.ArgumentParser(add_help=False) 
parent_parser.add_argument("-p", type=int, required=True, 
          help="set db parameter") 
parser_create = subparsers.add_parser("create", parents=[parent_parser], 
             help="create the orbix environment") 
parser_update = subparsers.add_parser("update", parents=[parent_parser], 
             help="update the orbix environment") 
+7

De los docs [] (https: // docs. python.org/3/library/argparse.html#sub-commands): "cuando se solicita un mensaje de ayuda de un subparser, solo se imprime la ayuda para ese analizador en particular. El mensaje de ayuda no incluirá el analizador padre o el analizador hermano mensajes ". Parece una gran deficiencia de esta estrategia. –

+0

Terminé agregando un argumento ficticio al analizador de raíz con un mensaje de ayuda. –

7

También puede bucle sobre los subparsers y añadir la misma opción para todos ellos.

parser = argparse.ArgumentParser(prog="myProg") 
subparsers = parser.add_subparsers(title="actions") 
parser.add_argument("-v", "--verbose", 
        action="store_true", 
        dest="VERBOSE", 
        help="run in verbose mode") 

parser_create = subparsers.add_parser ("create", 
             help = "create the orbix environment") 
parser_update = subparsers.add_parser ("update", 
             help = "update the orbix environment") 

for subparser in [parser_create, parser_update]: 
    subparser.add_argument ("-p", 
          type = int, 
          required = True, 
          help = "set db parameter") 
+1

, creo que es un mal enfoque, ya que es necesario revisar los parámetros. es más seco y revocable la respuesta de Sven Marnach. – NeoMorfeo

2

Puede recorrer sus subparsers de la siguiente manera.

for name, subp in subparsers.choices.items(): 
    print(subp) 
    subp.add_argument(dest='g', help='Inpput for g variable', default='7') 
Cuestiones relacionadas