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.

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)

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 .


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.