Pertanyaan ini sudah memiliki banyak jawaban yang sangat tinggi dan jawaban yang diterima, tetapi semuanya sejauh ini terganggu oleh berbagai cara untuk mengekspresikan masalah boolean dan melewatkan satu poin penting:
Saya memiliki skrip python yang dapat menerima argumen baris perintah nol atau tiga. (Entah itu berjalan pada perilaku default atau membutuhkan ketiga nilai yang ditentukan)
Logika ini seharusnya tidak menjadi tanggung jawab kode Anda , tetapi harus ditangani olehargparse
modul. Jangan repot-repot menulis pernyataan if kompleks, alih-alih lebih suka mengatur parser argumen Anda seperti ini:
#!/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)
Dan ya, itu harus menjadi pilihan bukan argumen posisi, karena bagaimanapun juga opsional .
diedit: Untuk mengatasi kekhawatiran LarsH dalam komentar, di bawah ini adalah contoh bagaimana Anda bisa menulisnya jika Anda yakin Anda menginginkan antarmuka dengan 3 atau 0argumen posisi . Saya berpendapat bahwa antarmuka sebelumnya adalah gaya yang lebih baik, karenaargumen opsional harus menjadi pilihan , tapi inilah pendekatan alternatif demi kelengkapan. Catat kwarg utamausage
saat membuat parser Anda, karenaargparse
akan secara otomatis menghasilkan pesan penggunaan yang menyesatkan!
#!/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)
Berikut ini beberapa contoh penggunaan:
# 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