¿Se puede decir a argparse en Python 2.7 que requiera un mínimo de DOS argumentos?

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 exceptúa un máximo de N argumentos, pero necesito aceptar un número infinito de argumentos siempre que haya al menos dos de ellos.

¿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 me sale:

 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 un solo 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 se imprime:

 Namespace(first='one', other=['two', 'three']) 

La respuesta corta es que no puedes hacer eso porque Nargs no admite algo como ‘2+’.

La respuesta larga es que puedes solucionar el problema usando 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:

  • Utilice el usage para proporcionar su propia cadena de uso al analizador
  • Use metavar para mostrar un argumento con un nombre diferente en la cadena de ayuda
  • Use SUPPRESS para evitar mostrar ayuda para una de las variables
  • Combine dos variables diferentes solo agregando un nuevo atributo al objeto de Namespace 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