2012-09-06 27 views
8

Me doy cuenta de que esto se parece mucho a Setting default option in Python of two mutually exclusive options using the argparse module aunque desde una perspectiva diferente (y las respuestas dadas allí no parecen ayudar).Establezca el valor predeterminado en falso si otro argumento mutuamente excluyente es verdadero

bloque de código (analizador es una instancia de argparse.ArgumentParser):

mutex_group = parser.add_mutually_exclusive_group() 
mutex_group.add_argument("--show", action="store_true", 
    dest="show", default=True) 
mutex_group.add_argument("--insert", action="store_true", 
    dest="insert") 

opts = parser.parse_args() 

Si ninguno --show o --insert se especifican Quiero defecto a --show (de ahí default=True), pero si se utiliza entonces --insertopts.show es todavía set true (debido al valor predeterminado), a pesar de ser parte de un bloque mutuamente exclusivo.

El código actual comprueba que ninguna de las otras opciones se han establecido cuando se prueba si opt.show es cierto, es decir:

if opts.show and not opts.insert: 
    do_something() 
elif opts.insert: 
    do_something_else() 

pero esto no escala (lo que sucede cuando se agrega a la --delete mutuamente excluyentes grupo, etc.) así que estoy buscando una forma mejor de hacer que todas las demás variables hagan opts.show falso mientras todavía lo tienen como predeterminado.

Al leer los documentos argparse, creo que una acción personalizada sería el camino a seguir, pero no puedo ver cómo acceder a los otros miembros del grupo mutuamente excluyente desde dentro (la teoría es que podría iterar sobre ellos, y cambiar el valor predeterminado si se estableció alguno de los demás). La otra opción sería invertir las condiciones if, pero eso parece impuro (si el valor predeterminado cambia, el orden de las sentencias if también debería cambiar).

Respuesta

19

Se me ocurre que tal vez 'store_const' sería una acción más apropiada (con todos los argumentos apuntando al mismo destino).

import argparse 
parser = argparse.ArgumentParser() 
mutex_group = parser.add_mutually_exclusive_group() 
mutex_group.add_argument("--show", action="store_const", 
    dest="mutex", const="show") 
mutex_group.add_argument("--insert", action="store_const", 
    dest="mutex", const="insert") 
mutex_group.add_argument('--delete', action="store_const", 
    dest="mutex", const="delete") 


parser.set_defaults(mutex='show') 
args = parser.parse_args() 
print(args) 

Ahora puede utilizar args.mutex para averiguar qué acción realizar.

Cuestiones relacionadas