argumento de análisis en python

Tengo un problema, estoy tratando de encontrar una solución. No estoy seguro de poder hacerlo con argparse.

Quiero poder especificar una opción

myprog -a 1 myprog -a 2 

Ahora, cuando tengo a = 1 , quiero poder especificar b y c . Pero cuando a = 2 , solo puedo especificar d .

 myprog -a 1 -b 3 -c 0 myprog -a 2 -d 3 

También debe especificarse siempre

No puede hacer esto con valores conmutados como una sola llamada parse_args , pero puede hacer uno de los siguientes:

  1. Use sub-comandos / sub-analizadores
  2. Realice un análisis parcial antes de configurar por completo el analizador y ejecutar en la línea de comandos completa, al principio solo busque a , y luego seleccione los argumentos adicionales del analizador para analizar según el resultado de la primera llamada. El truco es usar parse_known_args para la primera llamada, por lo que maneja a (que reconoce) e ignora todo lo demás.

Por ejemplo, para el enfoque # 2, podrías hacer:

 parser = argparse.ArgumentParser() parser.add_argument('-a', required=True, type=int, choices=(1, 2) args = parser.parse_known_args() if args.a == 1: parser.add_argument('-b', ...) parser.add_argument('-c', ...) args = parser.parse_args() else: parser.add_argument('-d', ...) args = parser.parse_args() 

La desventaja de este enfoque es que la información de uso emitida para un uso incorrecto será incompleta; tendría que incluir el texto que especifica el uso “real” en el analizador base manualmente, lo cual no es divertido. Los subparadores no pueden alternarse en función de los cambios de valor, pero tienen una pantalla de uso coherente y unificada.

La solución más sencilla es hacer que '-a' un argumento required=True , y dejar a los demás con el valor predeterminado no requerido. Luego, después de analizar, realice las pruebas en args.a y los otros valores (supongo que puede escribir ese tipo de lógica Python).

Puede boost sus propios errores, o puede usar una parser.error("I don't like your input") .

Usted necesita escribir una línea de usage personalizado. ¿Cuál sería un uso significativo, dados estos requisitos?

Existe un método de mutually exclusive argument group , pero no utiliza valores específicos, solo la presencia o no de argumentos.

También podría incorporar las pruebas en clases de acción personalizadas. Pero generalmente eso es más complicado que realizar las pruebas después del análisis (ya que argparse maneja los argumentos que ocurren en cualquier orden).

Otra posibilidad para convertir el argumento -a en un subparser. Eso le permite definir un conjunto de argumentos para un valor ‘analizador’, y otro conjunto para otro valor. Creo que la documentación argparse es bastante clara en eso.