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_boolevalúa a True. Este es el caso incluso cuando cambio cmd_linea 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 booltipo con valor de Trueo 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 unbooltipo con valorTrueoFalse. (Esta solución tiene una restricción: su opción debe tener un valor predeterminado).