Câu hỏi này đã có nhiều câu trả lời được đánh giá cao và một câu trả lời được chấp nhận, nhưng tất cả chúng đều bị phân tâm bởi nhiều cách khác nhau để diễn đạt vấn đề boolean và bỏ lỡ một điểm quan trọng:
Tôi có một kịch bản python có thể nhận được không hoặc ba đối số dòng lệnh. (Hoặc nó chạy trên hành vi mặc định hoặc cần cả ba giá trị được chỉ định)
Logic này không phải là trách nhiệm của mã của bạn ở nơi đầu tiên , thay vào đó nó phải được xử lý bởiargparse
mô-đun. Đừng bận tâm viết một câu lệnh if phức tạp, thay vào đó thích thiết lập trình phân tích cú pháp đối số của bạn như thế này:
#!/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)
Và vâng, nó nên là một tùy chọn không phải là một đối số vị trí, bởi vì nó là sau tất cả tùy chọn .
đã chỉnh sửa: Để giải quyết mối quan tâm của LarsH trong các bình luận, dưới đây là một ví dụ về cách bạn có thể viết nó nếu bạn chắc chắn rằng bạn muốn giao diện với 3 hoặc 0 đối số vị trí . Tôi cho rằng giao diện trước đó có phong cách tốt hơn, bởi vì các đối số tùy chọn nên là các tùy chọn , nhưng đây là một cách tiếp cận khác để hoàn thiện hơn. Lưu ý kwarg ghi đèusage
khi tạo trình phân tích cú pháp của bạn, bởi vìargparse
sẽ tự động tạo một thông báo sử dụng sai lệch!
#!/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)
Dưới đây là một số ví dụ sử dụng:
# 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