Vorrei usare argparse per analizzare gli argomenti booleani della riga di comando scritti come "--foo True" o "--foo False". Per esempio:
my_program --my_boolean_flag False
Tuttavia, il seguente codice di prova non fa quello che vorrei:
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)
Purtroppo, parsed_args.my_bool
valuta True
. Questo è il caso anche quando cambio cmd_line
a esserlo ["--my_bool", ""]
, il che è sorprendente, dal momento che lo bool("")
valuta False
.
Come posso ottenere argparse per analizzare "False"
, "F"
e la loro minuscole varianti di essere False
?
parser.add_argument('--feature', dest='feature', type=lambda x:bool(distutils.util.strtobool(x)))
. Quando viene utilizzata l'opzione, questa soluzione garantirà un bool
tipo con valore di True
o False
. Quando l'opzione non viene utilizzata, otterrai None
. ( distutils.util.strtobool(x)
è da un'altra domanda di StackOverflow )
parser.add_argument('--my_bool', action='store_true', default=False)
parser.add_argument('--feature', dest='feature', default=False, action='store_true')
. Questa soluzione ti garantirà sempre unbool
tipo con valoreTrue
oFalse
. (Questa soluzione ha un vincolo: l'opzione deve avere un valore predefinito.)