Diese Frage hatte bereits viele hoch bewertete Antworten und eine akzeptierte Antwort, aber alle waren bisher durch verschiedene Ausdrucksmöglichkeiten des booleschen Problems abgelenkt und haben einen entscheidenden Punkt übersehen:
Ich habe ein Python-Skript, das entweder null oder drei Befehlszeilenargumente empfangen kann. (Entweder wird das Standardverhalten ausgeführt oder es müssen alle drei angegebenen Werte angegeben werden.)
Diese Logik sollte nicht in erster Linie in der Verantwortung Ihres Codes liegen , sondern vomargparse
Modulbehandelt werden. Schreiben Sie keine komplexe if-Anweisung, sondern richten Sie Ihren Argument-Parser lieber wie folgt ein:
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser()
parser.add_argument('--foo', nargs=3, default=['x', 'y', 'z'])
args = parser.parse_args()
print(args.foo)
Und ja, es sollte eine Option sein, kein Positionsargument, denn es ist schließlich optional .
bearbeitet: Um das Problem von LarsH in den Kommentaren anzusprechen, finden Sie unten ein Beispiel dafür, wie Sie es schreiben könnten, wenn Sie sicher wären, dass Sie die Schnittstelle mit 3 oder 0 Positionsargumenten haben möchten. Ich bin der Meinung, dass die vorherige Benutzeroberfläche einen besseren Stil hat, da optionale Argumente Optionen sein sollten , aber der Vollständigkeit halber hier ein alternativer Ansatz. Beachten Sie das überschreibende kwargusage
beim Erstellen Ihres Parsers, daargparse
sonst automatisch eine irreführende Verwendungsnachricht generiert wird!
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser(usage='%(prog)s [-h] [a b c]\n')
parser.add_argument('abc', nargs='*', help='specify 3 or 0 items', default=['x', 'y', 'z'])
args = parser.parse_args()
if len(args.abc) != 3:
parser.error('expected 3 arguments')
print(args.abc)
Hier einige Anwendungsbeispiele:
# default case
wim@wim-zenbook:/tmp$ ./three_or_none.py
['x', 'y', 'z']
# explicit case
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2 3
['1', '2', '3']
# example failure mode
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2
usage: three_or_none.py [-h] [a b c]
three_or_none.py: error: expected 3 arguments