Ich verwende den folgenden einfachen Code, um einige Argumente zu analysieren. Beachten Sie, dass einer von ihnen erforderlich ist. Wenn der Benutzer das Skript ohne Angabe des Arguments ausführt, zeigt der angezeigte Verwendungs- / Hilfetext leider nicht an, dass es ein nicht optionales Argument gibt, was ich sehr verwirrend finde. Wie kann ich Python dazu bringen, anzuzeigen, dass ein Argument nicht optional ist?
Hier ist der Code:
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Foo')
parser.add_argument('-i','--input', help='Input file name', required=True)
parser.add_argument('-o','--output', help='Output file name', default="stdout")
args = parser.parse_args()
print ("Input file: %s" % args.input )
print ("Output file: %s" % args.output )
Wenn ich den obigen Code ohne Angabe des erforderlichen Arguments ausführe, erhalte ich die folgende Ausgabe:
usage: foo.py [-h] -i INPUT [-o OUTPUT]
Foo
optional arguments:
-h, --help show this help message and exit
-i INPUT, --input INPUT
Input file name
-o OUTPUT, --output OUTPUT
Output file name
-i INPUT
Teil nicht von eckigen Klammern umgeben, was subtil anzeigt, dass dies tatsächlich erforderlich ist. Sie können aber auch manuell erklären , dass durch diehelp
paramoptional arguments
für die erforderlichen Argumente ist immer noch irreführend.Antworten:
Parameter, die mit
-
oder beginnen,--
werden normalerweise als optional betrachtet. Alle anderen Parameter sind Positionsparameter und als solche vom Design erforderlich (wie Positionsfunktionsargumente). Es ist möglich, optionale Argumente zu verlangen, aber dies ist ein bisschen gegen ihr Design. Da sie immer noch Teil der nicht positionellen Argumente sind, werden sie auch dann unter der verwirrenden Überschrift "optionale Argumente" aufgeführt, wenn sie erforderlich sind. Die fehlenden eckigen Klammern im Verwendungsteil zeigen jedoch, dass sie tatsächlich erforderlich sind.Siehe auch die Dokumentation :
Davon abgesehen werden die Überschriften "Positionsargumente" und "optionale Argumente" in der Hilfe von zwei Argumentgruppen generiert, in die die Argumente automatisch unterteilt werden. Jetzt können Sie sich "hineinhacken" und den Namen der optionalen Argumente ändern. Eine weitaus elegantere Lösung wäre jedoch, eine weitere Gruppe für "erforderliche benannte Argumente" (oder wie auch immer Sie sie nennen möchten) zu erstellen:
quelle
parser.parse_args([])
Verwenden Sie stattdessenparser.parse_args()
keine Argumente, um den Inhalt von sys.argv zu erfassen. Per argparseDa ich die erforderlichen Argumente lieber vor dem optionalen auflisten möchte, hacke ich sie herum über:
und dies gibt aus:
Ich kann leben, ohne dass 'Hilfe' in der Gruppe der optionalen Argumente auftaucht.
quelle
Aufbau von @Karl Rosaen
und dies gibt aus:
quelle
_action_group
ohne auf ein geschütztes Mitglied zuzugreifen? In meinem Fall muss ich der bereits vorhandenen (benutzerdefinierten) Gruppe ein Argument hinzufügen.Noch einmal aus @RalphyZ aufbauen
Dieser bricht die exponierte API nicht.
Welches wird das gleiche wie oben zeigen und sollte zukünftige Versionen überleben:
quelle
_action_groups
ist nur für den internen Gebrauch bestimmt. Daher gibt es keine versatzübergreifende Kompatibilitätsgarantie.