parser example argumentparser arg_parser add_argument python argparse

python - example - Argparse: ¿Los argumentos requeridos se enumeran en "argumentos opcionales"?



python argparse argumentparser() (3)

Uso el siguiente código simple para analizar algunos argumentos; Tenga en cuenta que uno de ellos es obligatorio. Desafortunadamente, cuando el usuario ejecuta la secuencia de comandos sin proporcionar el argumento, el texto de uso / ayuda que se muestra no indica que haya un argumento no opcional, lo que me parece muy confuso. ¿Cómo puedo hacer que python indique 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 )

Cuando ejecuto código arriba 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


Como prefiero enumerar los argumentos requeridos antes que los opcionales, me meto en ellos 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


Los parámetros que comienzan con - o -- generalmente se consideran opcionales. Todos los otros parámetros son parámetros posicionales y, como tales, requeridos por diseño (como argumentos de función posicional). Es posible requerir argumentos opcionales, pero esto está un poco en contra de su diseño. Como todavía forman parte de los argumentos no posicionales, seguirán enumerados bajo el encabezado confuso "argumentos opcionales", incluso si son necesarios. Sin embargo, los corchetes faltantes en la parte de uso muestran que de hecho son necesarios.

Ver también la documentation :

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

Nota: Las opciones requeridas generalmente se consideran de mala calidad 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 son generados por 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 nombrados requeridos" (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