Das Parsen von Argumenten über die Befehlszeile kann mithilfe des argparse-Moduls in Python vereinfacht werden. Obwohl es das Parsen boolescher Flags unterstützt, können bestimmte Szenarien zu unerwarteten Ergebnissen führen.
Um boolesche Werte wie „--foo True“ oder „--foo False“ korrekt zu parsen, reicht das Standardverhalten von argparse möglicherweise nicht aus. Beispielsweise kann die alleinige Verwendung von type=bool zu unerwarteten Ergebnissen führen, wenn Argumente auf „False“ oder leere Zeichenfolgen gesetzt sind.
Eine Lösung besteht darin, die in Python 3.9 eingeführte BooleanOptionalAction zu nutzen. Diese Aktion ermöglicht eine intuitivere Handhabung boolescher Werte und konvertiert True, t, y, yes und 1 automatisch in True und False, f, n, no und 0 in False.
Für Python-Versionen früher 3.9 besteht eine Problemumgehung darin, die Aktionen „store_true“ und „store_false“ zu kombinieren. Die Aktion „store_true“ setzt ein Flag auf „True“, wenn es vorhanden ist, während „store_false“ es auf „False“ setzt. Standardmäßig wird davon ausgegangen, dass das Flag „True“ ist, sodass Benutzer sowohl positive als auch negative Flags angeben können:
<code class="python">import argparse parser = argparse.ArgumentParser(description="My parser") parser.add_argument('--feature', action='store_true') parser.add_argument('--no-feature', dest='feature', action='store_false') parser.set_defaults(feature=True) cmd_line = ["--no-feature"] parsed_args = parser.parse_args(cmd_line) if parsed_args.feature: print("Feature is True.") else: print("Feature is False.")</code>
Alternativ können benutzerdefinierte Funktionen definiert werden, um eine bestimmte Parsing-Logik zu verarbeiten. Zum Beispiel eine Funktion, die zwischen „True“ und „False“ unterscheidet, ohne Berücksichtigung der Groß- und Kleinschreibung:
<code class="python">def t_or_f(arg): ua = str(arg).upper() if 'TRUE'.startswith(ua): return True elif 'FALSE'.startswith(ua): return False else: raise ValueError("Invalid argument: {}".format(arg))</code>
Diese Funktion kann dann mit dem Typparameter von argparse verwendet werden:
<code class="python">import argparse parser = argparse.ArgumentParser(description="My parser") parser.add_argument('--my_bool', type=t_or_f) cmd_line = ["--my_bool", "False"] parsed_args = parser.parse_args(cmd_line) if parsed_args.my_bool: print("my_bool is True.") else: print("my_bool is False.")</code>
Das obige ist der detaillierte Inhalt vonWie gehe ich mit booleschen Argumenten mit argparse in Python richtig um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!