Boolesches Argument für das Skript

78

In Python verstehe ich, wie int- und str-Argumente zu Skripten hinzugefügt werden können.

parser=argparse.ArgumentParser(description="""Mydescription""")
parser.add_argument('-l', type=str, default='info', help='String argument')
parser.add_argument('-dt', type=int, default ='', help='int argument')

Was ist das für Boolesche?

Grundsätzlich möchte ich meinem Skript ein Flag übergeben, das dem Skript mitteilt, ob eine bestimmte Aktion ausgeführt werden soll oder nicht.

dublintech
quelle
2
Was ist los mit action='store_true'?
Rik Poggi
Welches Verhalten willst du mit Booleschen? (sagen wir mit '-v true' und '-v false'?)
kennytm

Antworten:

151

Sie können entweder das actionmit store_true| verwenden store_false, oder Sie können ein int verwenden und implizites Casting einen booleschen Wert überprüfen lassen.

Mit dem actionwürden Sie ein --foo=trueund --foo=false-Dargument nicht übergeben , sondern es einfach einschließen, wenn es auf true gesetzt würde.

python myProgram.py --foo

In der Tat denke ich, was Sie vielleicht wollen, ist

parser.add_argument('-b', action='store_true', default=False)
sberry
quelle
7
Ich glaube nicht, dass default=Falsees notwendig ist.
Paul Draper
24
@PaulDraper: Explizit ist besser als implizit.
Sberry
@PaulDraper Ich habe überprüft, dass es nicht benötigt wird, aber Sie können es als expliziten Wert setzen.
Caumons
@PaulDraper Ist die Standardeinstellung für boolean True nicht?
Aerin
19
parser.add_argument('--foo', action='store_true')
Ned Batchelder
quelle
7
import distutils.util
ARGP.add_argument('--on', '-o', type=distutils.util.strtobool, default='true')

Beispiel, wie man es nennt:

$ ./myscript                # argp.on = 1
$ ./myscript --on=false     # argp.on = 0
$ ./myscript --on=False     # argp.on = 0
$ ./myscript --on=0         # argp.on = 0
$ ./myscript --on=1         # argp.on = 1
$ ./myscript -o0            # argp.on = 0
$ ./myscript -o false       # argp.on == 0

Ich sollte erwähnen, dass Sie das Argument auch an eine lokale Wrapper-Funktion binden können, um eine andere exakte Zeichenfolgenübereinstimmung zu handhaben, wenn Sie Werte wie "Ja" und "Nein" unterstützen möchten. Sie können auch versuchen, die Eingabe als yaml zu interpretieren, was auch Ja / Nein verarbeiten kann. Ich habe das schon eine Weile nicht mehr gemacht, und ich denke, in letzter Zeit habe ich mich gegenseitig ausschließende Argumente mit dem gleichen destWert, eins --no-optionmit action='store_false'und eins --optionmitaction='store_true'

ThorSummoner
quelle