namespace example dest argumentparser add_argument python argparse

example - namespace python argparse



CondiciĆ³n del entero de argparse de Python(>=12) (4)

¿Qué tal esto?

import sys, argparse parser = argparse.ArgumentParser() parser.add_argument( "-b", "--bandwidth", type=lambda x: (int(x) > 11) and int(x) or sys.exit("Minimum bandwidth is 12"), help="target bandwidth >=12" )

Pero por favor, no lo probé en un código real. O puede cambiar sys.exit a parser.error como lo escribió @jonatan.

Necesito solicitar que un argumento sea> = 12 usando argparse .

No puedo encontrar una manera de obtener este resultado usando argparse , parece que no hay forma de establecer reglas en un valor dado, sino solo conjuntos completos de valores aceptados, como elecciones = [''roca'', ''papel'', ''tijeras''].

Mi código es:

import sys, argparse parser = argparse.ArgumentParser() parser.add_argument("-b", "--bandwidth", type=int, help="target bandwidth >=12") args = parser.parse_args() if args.bandwidth and args.bandwidth < 12: print "ERROR: minimum bandwidth is 12" sys.exit(1)

Me pregunto si hay una manera de obtener este resultado directamente con alguna opción argparse .


Puede llamar al error del analizador sin crear tipos personalizados o funciones separadas. Un simple cambio en su ejemplo de código es suficiente:

import argparse parser = argparse.ArgumentParser() parser.add_argument("-b", "--bandwidth", type=int, help="target bandwidth >=12") args = parser.parse_args() if args.bandwidth and args.bandwidth < 12: parser.error("Minimum bandwidth is 12")

Esto hará que la aplicación salga y muestre el error del analizador:

$ python test.py --bandwidth 11 usage: test.py [-h] [-b BANDWIDTH] test.py: error: Minimum bandwidth is 12


Puedes probar con algo que introduzcas en tu explicación:

import sys, argparse parser = argparse.ArgumentParser() parser.add_argument("-b", "--bandwidth", type=int, choices=range(12,100)) args = parser.parse_args()

por ejemplo, por lo tanto, es Argparse que generará el error en sí mismo con una invalid choice


Una forma es usar un tipo personalizado.

def bandwidth_type(x): x = int(x) if x < 12: raise argparse.ArgumentTypeError("Minimum bandwidth is 12") return x parser.add_argument("-b", "--bandwidth", type=bandwidth_type, help="target bandwidth >= 12")

Nota: Creo que ArgumentTypeError es una excepción más correcta para aumentar que ArgumentError . Sin embargo, ArgumentTypeError no está documentado como una clase pública por argparse , por lo que puede no considerarse correcto utilizarlo en su propio código. Una opción que me gusta es usar argparse.error como lo hace alecxe en su respuesta, aunque usaría una acción personalizada en lugar de una función de tipo para obtener acceso al objeto analizador.

Una opción más flexible es una acción personalizada, que proporciona acceso al analizador actual y al objeto de espacio de nombres.

class BandwidthAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): if values < 12: parser.error("Minimum bandwidth for {0} is 12".format(option_string)) #raise argparse.ArgumentError("Minimum bandwidth is 12") setattr(namespace, self.dest, values) parser.add_argument("-b", "--bandwidth", action=BandwidthAction, type=int, help="target bandwidth >= 12")