¿Se puede decir que Argparse en Python 2.7 requerirá un mínimo de dos argumentos?

StackOverflow https://stackoverflow.com/questions/8411218

  •  29-10-2019
  •  | 
  •  

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.

¿Fue útil?

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'])
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top