Me gustaría utilizar argparse para analizar argumentos de línea de comandos booleanos escritos como "--foo True" o "--foo False". Por ejemplo:
my_program --my_boolean_flag False
Sin embargo, el siguiente código de prueba no hace lo que me gustaría:
import argparse
parser = argparse.ArgumentParser(description="My parser")
parser.add_argument("--my_bool", type=bool)
cmd_line = ["--my_bool", "False"]
parsed_args = parser.parse(cmd_line)
Tristemente, parsed_args.my_bool
evalúa a True
. Este es el caso incluso cuando cambio cmd_line
a ser ["--my_bool", ""]
, lo cual es sorprendente, ya que bool("")
evalúa False
.
¿Cómo puedo obtener argparse a analizar "False"
, "F"
y su minúscula variantes que se vayan False
?
parser.add_argument('--feature', dest='feature', type=lambda x:bool(distutils.util.strtobool(x)))
. Cuando se utiliza la opción, esta solución garantizará un bool
tipo con valor de True
o False
. Cuando no se utiliza la opción, obtendrá None
. ( distutils.util.strtobool(x)
es de otra pregunta de stackoverflow )
parser.add_argument('--my_bool', action='store_true', default=False)
parser.add_argument('--feature', dest='feature', default=False, action='store_true')
. Esta solución le garantizará que siempre obtenga unbool
tipo con valorTrue
oFalse
. (Esta solución tiene una restricción: su opción debe tener un valor predeterminado).