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