2012-08-17 17 views
7

Estoy usando el módulo argparse en Python para analizar parámetros escritos en una interfaz de línea de comandos. Tengo la siguiente llamada a un objeto add_argument subparser:Python argparse: metavar y action = store_true juntos

submit_parser.add_argument('-pv','--provision',metavar='PROVISION', dest='PROVISION', 
           help='provision system', 
           action='store_true', default=False, required=False) 

consigo este error:

Traceback (most recent call last): 
    File "./scripts/tp4", line 94, in <module> 
    main() 
    File "./scripts/tp4", line 74, in main 
    modloader.loadModules(sub_parsers) 
    File "/usr/lib/python2.6/site-packages/tp4/cli/Moduleloader.py", line 66, in loadModules 
    registered_modules[module_name].setSubparserArgs(module_sub_parser) 
    File "/usr/lib/python2.6/site-packages/tp4/cli/modules/AutotestModule.py", line 135, in setSubparserArgs 
    action='store_true', default=False, required=False) 
    File "/usr/share/tp4/cli/zip/argparse.zip/argparse.py", line 1302, in add_argument 
    TypeError: __init__() got an unexpected keyword argument 'metavar' 

Si quito parámetros de acción o metavar, funciona. ¿Por qué ambos no pueden estar juntos? No hay nada acerca de esta restricción en la documentación argparse en http://docs.python.org/dev/library/argparse.html.

Gracias de antemano por cualquier ayuda

+0

versión de Python .... es algo importante que debe comprobarse .... – avasal

+0

No es que lo haya preguntado, pero si 'action' es' 'store_true'', el valor predeterminado ya es 'False' (y si acción es '' store_false'' el valor predeterminado es 'True'). Es bastante conveniente, aunque diferente de 'optparse' (donde el valor predeterminado es' Ninguno' en ambos casos). – torek

Respuesta

13

Un metavar sólo tiene sentido para los argumentos posicionales (piensa en nombres de archivo al final de la línea de comandos) o para cuando una discusión toma argumentos de su propia (como --input-files foo.txt bar.txt).

Su argumento --provision es una marca porque ha configurado action en store_true. No toma ningún argumento (es decir, nargs no está configurado). Como tal, no tiene sentido tener un metavar.

De the argparse documentation:

When ArgumentParser generates help messages, it need some way to refer to each expected argument. By default, ArgumentParser objects use the dest value as the “name” of each object. By default, for positional argument actions, the dest value is used directly, and for optional argument actions, the dest value is uppercased. So, a single positional argument with dest='bar' will be referred to as bar. A single optional argument --foo that should be followed by a single command-line argument will be referred to as FOO.

+3

Gracias por la explicación. Sin embargo, esta información no está explícita en la documentación argparse. –

+3

Para los escasos documentos de Python, invariablemente termino recibiendo respuestas del sitio web de PYMOTW, http://pymotw.com/2/argparse/ – qneill

+2

Estaba usando 'metavar =' cuando lo que realmente quería era 'dest ='. – aldo

-2

Para extraer una respuesta de @pwc, es necesario utilizar dest en lugar de metavar.

Cuestiones relacionadas