Argparse: argumentos obligatorios enumerados en “argumentos opcionales”?

Utilizo el siguiente código simple para analizar algunos argumentos; Tenga en cuenta que uno de ellos es obligatorio. Desafortunadamente, cuando el usuario ejecuta el script sin proporcionar el argumento, el texto de uso / ayuda que se muestra no indica que haya un argumento no opcional, lo cual me parece muy confuso. ¿Cómo puedo obtener Python para indicar que un argumento no es opcional?

Aquí está el código:

import argparse if __name__ == '__main__': parser = argparse.ArgumentParser( description='Foo') parser.add_argument('-i','--input', help='Input file name', required=True) parser.add_argument('-o','--output', help='Output file name', default="stdout") args = parser.parse_args() print ("Input file: %s" % args.input ) print ("Output file: %s" % args.output ) 

Al ejecutar el código anterior sin proporcionar el argumento requerido, obtengo el siguiente resultado:

 usage: foo.py [-h] -i INPUT [-o OUTPUT] Foo optional arguments: -h, --help show this help message and exit -i INPUT, --input INPUT Input file name -o OUTPUT, --output OUTPUT Output file name 

Los parámetros que comienzan con - o -- generalmente se consideran opcionales. Todos los demás parámetros son parámetros posicionales y, como tales, los requiere el diseño (como los argumentos de la función posicional). Es posible requerir argumentos opcionales, pero esto es un poco en contra de su diseño. Ya que aún son parte de los argumentos no posicionales, aún serán listados bajo el encabezado confuso “argumentos opcionales” incluso si son necesarios. Sin embargo, los corchetes que faltan en la parte de uso muestran que efectivamente se requieren.

Véase también la documentación :

En general, el módulo argparse asume que los indicadores como -f y –bar indican argumentos opcionales, que siempre se pueden omitir en la línea de comando.

Nota: las opciones requeridas generalmente se consideran incorrectas porque los usuarios esperan que las opciones sean opcionales y, por lo tanto, deben evitarse cuando sea posible.

Dicho esto, los encabezados “argumentos posicionales” y “argumentos opcionales” en la ayuda se generan mediante dos grupos de argumentos en los que los argumentos se separan automáticamente. Ahora, podría “piratearlo” y cambiar el nombre de los opcionales, pero una solución mucho más elegante sería crear otro grupo para “argumentos con nombre requerido” (o como quiera que los llame):

 parser = argparse.ArgumentParser(description='Foo') parser.add_argument('-o', '--output', help='Output file name', default='stdout') requiredNamed = parser.add_argument_group('required named arguments') requiredNamed.add_argument('-i', '--input', help='Input file name', required=True) parser.parse_args(['-h']) 
 usage: [-h] [-o OUTPUT] -i INPUT Foo optional arguments: -h, --help show this help message and exit -o OUTPUT, --output OUTPUT Output file name required named arguments: -i INPUT, --input INPUT Input file name 

Ya que prefiero enumerar los argumentos requeridos antes que los opcionales, lo hackeo a través de:

  parser = argparse.ArgumentParser() parser._action_groups.pop() required = parser.add_argument_group('required arguments') optional = parser.add_argument_group('optional arguments') required.add_argument('--required_arg') optional.add_argument('--optional_arg') return parser.parse_args() 

y esto produce:

 usage: main.py [-h] [--required_arg REQUIRED_ARG] [--optional_arg OPTIONAL_ARG] required arguments: --required_arg REQUIRED_ARG optional arguments: --optional_arg OPTIONAL_ARG 

Puedo vivir sin que aparezca ‘ayuda’ en el grupo de argumentos opcionales.

Construcción de @Karl Rosaen

 parser = argparse.ArgumentParser() optional = parser._action_groups.pop() # Edited this line required = parser.add_argument_group('required arguments') # remove this line: optional = parser... required.add_argument('--required_arg') optional.add_argument('--optional_arg') parser._action_groups.append(optional) # added this line return parser.parse_args() 

y esto produce:

 usage: main.py [-h] [--required_arg REQUIRED_ARG] [--optional_arg OPTIONAL_ARG] required arguments: --required_arg REQUIRED_ARG optional arguments: -h, --help show this help message and exit --optional_arg OPTIONAL_ARG