Argparse - Cómo especificar un subcomando predeterminado
Estoy usando el paquete argparse de Python 2.7 para escribir alguna lógica de análisis de opciones para una herramienta de línea de comandos. La herramienta debe aceptar uno de los siguientes argumentos:
"ON": activa una función.
"OFF": apaga una función.
[No se proporcionan argumentos]: Eco el estado actual de la función.
Mirar la documentación de argparse me llevó a creer que quería que se definieran dos, posiblemente tres, subcomandos, ya que estos tres estados son mutuamente excluyentes y representan diferentes actividades conceptuales. Este es mi intento actual en el código:
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
parser.set_defaults(func=print_state) # I think this line is wrong.
parser_on = subparsers.add_parser('ON')
parser_on.set_defaults(func=set_state, newstate='ON')
parser_off = subparsers.add_parser('OFF')
parser_off.set_defaults(func=set_state, newstate='OFF')
args = parser.parse_args()
if(args.func == set_state):
set_state(args.newstate)
elif(args.func == print_state):
print_state()
else:
args.func() # Catchall in case I add more functions later
Tenía la impresión de que si proporcionaba 0 argumentos, el analizador principal estableceríafunc=print_state
, y si proporcioné 1 argumento, el analizador principal usaría los valores predeterminados del subcomando apropiado y llamaría afunc=set_state
. En cambio, me sale el siguiente error con 0 argumentos:
usage: cvsSecure.py [-h] {ON,OFF} ...
cvsSecure.py: error: too few arguments
Y si proporciono "OFF" u "ON",print_state
recibe una llamada en lugar deset_state
. Si comento elparser.set_defaults
line,set_state
se llama correctamente.
Soy un programador de nivel oficial, pero soy un principiante en Python. ¿Alguna sugerencia sobre cómo puedo hacer que esto funcione?
Edita: Otra razón por la que estaba mirando los subcomandos era una cuarta función potencial que estoy considerando para el futuro:
"FORCE txtval": establezca el estado de la función entxtval
.