¿Se puede decir que Argparse en Python 2.7 requerirá un mínimo de dos argumentos?
Pregunta
Mi aplicación es una utilidad de comparación de archivos especializada y obviamente no tiene sentido comparar solo un archivo, por lo que nargs='+'
no es del todo apropiado.
nargs=N
solo excepto un máximo de N
Argumentos, pero necesito aceptar un número infinito de argumentos siempre que haya al menos dos de ellos.
Solución
La respuesta corta es que no puedes hacer eso porque Nargs no admite algo como '2+'.
La respuesta larga es que puede volver a solucionar que usar algo como esto:
parser = argparse.ArgumentParser(usage='%(prog)s [-h] file file [file ...]')
parser.add_argument('file1', nargs=1, metavar='file')
parser.add_argument('file2', nargs='+', metavar='file', help=argparse.SUPPRESS)
namespace = parser.parse_args()
namespace.file = namespace.file1 + namespace.file2
Los trucos que necesitas son:
- Usar
usage
Para proporcionarle su propia cadena de uso al analizador - Usar
metavar
Para mostrar un argumento con un nombre diferente en la cadena de ayuda - Usar
SUPPRESS
Para evitar mostrar ayuda para una de las variables - Fusionar dos variables diferentes solo agregando un nuevo atributo al
Namespace
Objeto que devuelve el analizador
El ejemplo anterior produce la siguiente cadena de ayuda:
usage: test.py [-h] file file [file ...]
positional arguments:
file
optional arguments:
-h, --help show this help message and exit
y aún fallará cuando se pasen menos de dos argumentos:
$ python test.py arg
usage: test.py [-h] file file [file ...]
test.py: error: too few arguments
Otros consejos
¿No podrías hacer algo como esto?
import argparse
parser = argparse.ArgumentParser(description = "Compare files")
parser.add_argument('first', help="the first file")
parser.add_argument('other', nargs='+', help="the other files")
args = parser.parse_args()
print args
Cuando ejecuto esto con -h
Yo obtengo:
usage: script.py [-h] first other [other ...]
Compare files
positional arguments:
first the first file
other the other files
optional arguments:
-h, --help show this help message and exit
Cuando lo ejecuto con solo un argumento, no funcionará:
usage: script.py [-h] first other [other ...]
script.py: error: too few arguments
Pero dos o más argumentos están bien. Con tres argumentos imprime:
Namespace(first='one', other=['two', 'three'])