Python argparse: ¿Hay una manera de especificar un rango en nargs?
Pregunta
Tengo un argumento opcional que admite una propia lista de argumentos.
Es decir, se debe apoyar:
- -f 1 2
- -f 1 2 3
pero no:
- -f 1
- -f 1 2 3 4
¿Hay una manera de forzar esto dentro argparse? Ahora estoy usando nargs = "*", y después de comprobar la longitud de la lista.
Editar: a lo solicitado, lo que necesitaba es ser capaz de definir un rango de número aceptable de argumentos. Es decir, diciendo (en el ejemplo) 2 o 3 args es correcto, pero no 1 o 4 o cualquier cosa que no está dentro de la gama 2..3
Solución
Se puede hacer esto con un acción personalizada :
import argparse
def required_length(nmin,nmax):
class RequiredLength(argparse.Action):
def __call__(self, parser, args, values, option_string=None):
if not nmin<=len(values)<=nmax:
msg='argument "{f}" requires between {nmin} and {nmax} arguments'.format(
f=self.dest,nmin=nmin,nmax=nmax)
raise argparse.ArgumentTypeError(msg)
setattr(args, self.dest, values)
return RequiredLength
parser=argparse.ArgumentParser(prog='PROG')
parser.add_argument('-f', nargs='+', action=required_length(2,3))
args=parser.parse_args('-f 1 2 3'.split())
print(args.f)
# ['1', '2', '3']
try:
args=parser.parse_args('-f 1 2 3 4'.split())
print(args)
except argparse.ArgumentTypeError as err:
print(err)
# argument "f" requires between 2 and 3 arguments
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow