To pytanie miało już wiele bardzo pozytywnych odpowiedzi i akceptowaną odpowiedź, ale jak dotąd wszystkie z nich były rozpraszane różnymi sposobami wyrażenia problemu logicznego i pominęły kluczowy punkt:
Mam skrypt w języku Python, który może otrzymać zero lub trzy argumenty wiersza poleceń. (Albo działa z zachowaniem domyślnym, albo wymaga określenia wszystkich trzech wartości)
Ta logika nie powinna leżeć w gestii twojego kodu , raczej powinna być obsługiwana przezargparse
moduł. Nie kłopocz się pisaniem złożonej instrukcji if, zamiast tego wolisz ustawić parser argumentów w następujący sposób:
import argparse as ap
parser = ap.ArgumentParser()
parser.add_argument('--foo', nargs=3, default=['x', 'y', 'z'])
args = parser.parse_args()
print(args.foo)
I tak, powinna to być opcja, a nie argument pozycyjny, bo przecież jest opcjonalna .
edytowane: Aby rozwiązać problem LarsHa w komentarzach, poniżej znajduje się przykład, jak można by to napisać, gdybyś był pewien, że chciałbyś mieć interfejs z 3 lub 0argumentami pozycyjnymi . Jestem zdania, że poprzedni interfejs ma lepszy styl, ponieważ opcjonalnymi argumentami powinny być opcje , ale tutaj jest alternatywne podejście ze względu na kompletność. Zwróć uwagę na nadpisywanie kwargusage
podczas tworzenia parsera, ponieważ wargparse
przeciwnym razie automatycznie wygeneruje mylący komunikat o użytkowaniu!
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)
Oto kilka przykładów użycia:
wim@wim-zenbook:/tmp$ ./three_or_none.py
['x', 'y', 'z']
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2 3
['1', '2', '3']
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