Yêu cầu một trong hai đối số sử dụng argparse


182

Được:

import argparse

pa = argparse.ArgumentParser()
pa.add_argument('--foo')
pa.add_argument('--bar')

print pa.parse_args('--foo 1'.split())

Làm thế nào để tôi

  • làm tại một trong ít nhất của "foo, bar" bắt buộc: --foo x, --bar y--foo x --bar ycũng tốt
  • thực hiện tối đa một trong những "foo, bar" bắt buộc: --foo xhoặc --bar yổn, --foo x --bar ykhông

Câu trả lời:


295

Tôi nghĩ rằng bạn đang tìm kiếm một cái gì đó như loại trừ lẫn nhau (ít nhất là cho phần thứ hai của câu hỏi của bạn).

Bằng cách này, chỉ foo hoặc thanh sẽ được chấp nhận, không phải cả hai.

    import argparse

    parser = argparse.ArgumentParser()
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('--foo',action=.....)
    group.add_argument('--bar',action=.....)
    args = parser.parse_args()

BTW, chỉ tìm thấy một câu hỏi khác đề cập đến cùng loại vấn đề.

Hi vọng điêu nay co ich


1
Tôi không bao giờ có thể đoán nó là dễ dàng như vậy! Yêu bạn Python 3.6!
bjd2385

Ai là Christian Witts và câu trả lời của anh ấy ở đâu?
ijoseph

3
HEy @ijoseph, câu trả lời này là cũ. Tôi không chắc câu trả lời là gì nữa. Nó có lẽ đã được gỡ bỏ ngay bây giờ. Xin lỗi vì điều đó!
jlengrand

1
@jlengrand câu trả lời của bạn vẫn có hiệu quả với tôi sau khi tôi nhận ra rằng nó thực sự giải quyết được cả hai điều kiện được đề xuất trong câu hỏi ( XORvề cơ bản). Mối quan tâm ban đầu của tôi là bạn chỉ giải quyết được một trong hai điều kiện.
ijoseph

Cảm ơn vì bạn đã phản hồi. Tôi có một ý tưởng rằng nó đã giải quyết mọi thứ thực sự, nhưng không chắc nữa: D. Tôi sẽ chỉnh sửa câu trả lời cho phù hợp!
jlengrand

39

Nếu bạn cần một số kiểm tra không được cung cấp bởi mô-đun, bạn luôn có thể thực hiện thủ công:

pa = argparse.ArgumentParser()
...
args = pa.parse_args()

if args.foo is None and args.bar is None:
   pa.error("at least one of --foo and --bar required")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.