Python argparse: Standardwert oder angegebener Wert

174

Ich möchte ein optionales Argument haben, das standardmäßig einen Wert verwendet, wenn nur das Flag ohne angegebenen Wert vorhanden ist, aber einen benutzerdefinierten Wert anstelle des Standardwerts speichert, wenn der Benutzer einen Wert angibt. Gibt es dafür bereits eine Aktion?

Ein Beispiel:

python script.py --example
# args.example would equal a default value of 1
python script.py --example 2
# args.example would equal a default value of 2

Ich kann eine Aktion erstellen, wollte aber sehen, ob es dafür einen Weg gibt.

rauben
quelle

Antworten:

272
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--example', nargs='?', const=1, type=int)
args = parser.parse_args()
print(args)

% test.py 
Namespace(example=None)
% test.py --example
Namespace(example=1)
% test.py --example 2
Namespace(example=2)

  • nargs='?' bedeutet 0 oder 1 Argumente
  • const=1 Legt den Standard fest, wenn 0 Argumente vorhanden sind
  • type=int konvertiert das Argument in int

Wenn Sie 1 test.pysetzen möchten , exampleauch wenn no --exampleangegeben ist, schließen Sie ein default=1. Das heißt, mit

parser.add_argument('--example', nargs='?', const=1, type=int, default=1)

dann

% test.py 
Namespace(example=1)
unutbu
quelle
Wie mache ich das mit Strings? Ich habe ein Dilemma mit der Unterscheidung von "" (leere Zeichenfolge als Standard) und "" (leere Zeichenfolge, wie vom Benutzer eingegeben). Im Code verwende ich momentan die Standardeinstellung und da ich einige Operationen ausführen muss, habe ich so etwas self.foo = (args.bar or some_else_source).upper(). Es wird auf keinem Objekt AFAIUC brechen.
0andriy
16

Eigentlich müssen Sie nur das defaultArgument verwenden, um add_argumentwie in diesem test.pySkript:

import argparse

if __name__ == '__main__':

    parser = argparse.ArgumentParser()
    parser.add_argument('--example', default=1)
    args = parser.parse_args()
    print(args.example)

test.py --example
% 1
test.py --example 2
% 2

Details finden Sie hier .

Adam Erickson
quelle
7

Der Unterschied zwischen:

parser.add_argument("--debug", help="Debug", nargs='?', type=int, const=1, default=7)

und

parser.add_argument("--debug", help="Debug", nargs='?', type=int, const=1)

Somit:

myscript.py => Debug ist im ersten Fall 7 (von Standard) und im zweiten "Keine"

myscript.py --debug => Debug ist jeweils 1

myscript.py --debug 2 => Debug ist jeweils 2

Murray
quelle