Ich verwende arparse, um ein config dict zu aktualisieren, indem ich die in der Befehlszeile angegebenen Werte verwende. Da ich nur die Werte in der Konfiguration aktualisieren möchte, für die ein Wert explizit in der Befehlszeile erwähnt wurde.
Daher versuche ich, nicht spezifizierte Argumente zu identifizieren, indem ich für jede Aktion überprüfe, ob getattr(args, action.dest) == action.default
oder Gleichheit des Typs konvertiertes arg ist. Dann aktualisiere ich alle meine Werte in dem Diktat, für das dies falsch ist.
Aber das scheitert natürlich, wenn ich in der Kommandozeile explizit ein Argument anlege, das meinem Standardargument entspricht. Gibt es eine Möglichkeit, diese explizit genannten Argumente mit argparser zu identifizieren oder habe ich um sie in sys.argv manuell zu identifizieren?
Danke!
Bearbeiten:
Um meine Absichten klarer zu machen. Ich habe ein Argument wie folgt:
parser.add_argument('--test', default='meaningful_default')
und eine Konfiguration wie
config = { 'test' : 'nondefault_val'}
Nun möchte ich die Konfiguration nur mit den explizit angegebenen Argumenten aktualisieren. Das Vergleichen der args-Attribute mit den Standardwerten funktioniert, solange ich nicht so etwas wie prog.py --test meaningful_default
vorschlage, um meine Konfiguration erneut mit einem Wert zu aktualisieren, der zufälligerweise auch der Standardwert
Das parser
behält ein seen_actions
set-Objekt beim Parsen bei (in der _parse_known_args
-Methode). Am Ende der Analyse überprüft es diese Menge gegen die erforderlichen Argumente (Einsen mit required=True
) und kann einen Fehler ausgeben. Eine Variation wird auch mit sich gegenseitig ausschließenden Gruppen verwendet.
Aber diese Variable ist außerhalb dieser Funktion nicht verfügbar. Kurz vor einer Art "Haken", mit dem Sie Ihre eigenen Tests innerhalb der Aktion parse_args
anwenden können, ist es die beste Option, die Standardeinstellungen zu testen. Oder Sie können sys.argv[1:]
betrachten.
Der Standardwert default
ist None
. Das ist schön für diesen Zweck, weil Ihr Benutzer diesen Wert nicht angeben kann. Das heißt, es gibt keine Zeichenfolge, die in None
konvertiert wird (zumindest nicht in einer der normalen type
-Methoden).
Wenn Sie argparse verwenden und Standardwerte angeben können, gibt es eine einfache Lösung mit zwei Parsern.
Ich. Definieren Sie Ihren Hauptparser und parsen Sie alle Ihre Argumente mit den richtigen Standardwerten:
%Vor% II. Definieren Sie einen Hilfsparser mit argument_default=argparse.SUPPRESS
, um nicht spezifizierte Argumente auszuschließen. Fügen Sie alle Argumente aus dem Hauptparser hinzu, aber ohne Standardwerte:
Dies ist keine besonders elegante Lösung, aber funktioniert gut mit argparse und all seinen Vorteilen.