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")