Esta pregunta ya tenía muchas respuestas altamente votadas y una respuesta aceptada, pero todas hasta ahora estaban distraídas por varias formas de expresar el problema booleano y perdieron un punto crucial:
Tengo un script de Python que puede recibir cero o tres argumentos de línea de comando. (Se ejecuta con el comportamiento predeterminado o necesita los tres valores especificados)
Esta lógica no debe ser responsabilidad de su código en primer lugar , sino que debe ser manejada por elargparse
módulo. No se moleste en escribir una declaración if compleja, en su lugar, prefiera configurar su analizador de argumentos de la siguiente manera:
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser()
parser.add_argument('--foo', nargs=3, default=['x', 'y', 'z'])
args = parser.parse_args()
print(args.foo)
Y sí, debería ser una opción, no un argumento posicional, porque después de todo es opcional .
editado: para abordar la preocupación de LarsH en los comentarios, a continuación se muestra un ejemplo de cómo podría escribirlo si estaba seguro de que deseaba la interfaz con 3 o 0argumentos posicionales . Soy de la opinión de que la interfaz anterior es mejor estilo, porque losargumentos opcionales deberían ser opciones , pero aquí hay un enfoque alternativo en aras de la integridad. Tenga en cuenta la omisión de kwargusage
al crear su analizador, porque deargparse
lo contrario generará automáticamente un mensaje de uso engañoso.
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser(usage='%(prog)s [-h] [a b c]\n')
parser.add_argument('abc', nargs='*', help='specify 3 or 0 items', default=['x', 'y', 'z'])
args = parser.parse_args()
if len(args.abc) != 3:
parser.error('expected 3 arguments')
print(args.abc)
Aquí hay algunos ejemplos de uso:
# default case
wim@wim-zenbook:/tmp$ ./three_or_none.py
['x', 'y', 'z']
# explicit case
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2 3
['1', '2', '3']
# example failure mode
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2
usage: three_or_none.py [-h] [a b c]
three_or_none.py: error: expected 3 arguments