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 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 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
-i INPUT
parte no está rodeada por corchetes, lo que indica que es necesario. Además, puede explicarlo manualmente a través delhelp
parámetrooptional arguments
para los argumentos requeridos sigue siendo engañoso.Respuestas:
Los parámetros que comienzan con
-
o--
generalmente se consideran opcionales. Todos los demás parámetros son parámetros posicionales y, como tales, son requeridos por el diseño (como los argumentos de la función posicional). Es posible requerir argumentos opcionales, pero esto va en contra de su diseño. Dado que todavía son parte de los argumentos no posicionales, se enumerarán 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 obligatorios.Ver también la documentación :
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 "hackearlo" y cambiar el nombre de los opcionales, pero una solución mucho más elegante sería crear otro grupo para "argumentos con nombre requeridos" (o como quiera llamarlos):
fuente
parser.parse_args([])
lugar, useparser.parse_args()
sin argumentos para capturar el contenido de sys.argv. Por argumentoComo prefiero enumerar los argumentos requeridos antes que los opcionales, lo pirateo a través de:
y esto produce:
Puedo vivir sin 'ayuda' apareciendo en el grupo de argumentos opcionales.
fuente
Edificio fuera de @Karl Rosaen
y esto produce:
fuente
_action_group
sin acceder al miembro protegido? En mi caso, necesito agregar algún argumento al grupo ya existente (personalizado).Una vez más, construyendo a partir de @RalphyZ
Este no rompe la API expuesta.
Que mostrará lo mismo que arriba y debería sobrevivir a futuras versiones:
fuente
_action_groups
está destinado solo para uso interno. Por lo tanto, no hay garantía de compatibilidad entre versiones.