ต้องการอาร์กิวเมนต์สองตัวใดตัวหนึ่งโดยใช้อาร์กิวเมนต์


183

ได้รับ:

import argparse

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

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

ฉันจะทำอย่างไร

  • ทำอย่างหนึ่งอย่างน้อย "ฟูบาร์" บังคับ: --foo x, --bar yและ--foo x --bar yจะมีการปรับ
  • ทำอย่างใดอย่างหนึ่งมากที่สุดของ "ฟูบาร์" ที่บังคับใช้: --foo xหรือ--bar yจะมีการปรับ--foo x --bar yไม่ได้

คำตอบ:


297

ฉันคิดว่าคุณกำลังค้นหาสิ่งที่ต้องการแยกออกจากกัน (อย่างน้อยก็ในส่วนที่สองของคำถามของคุณ)

วิธีนี้จะยอมรับเฉพาะ foo หรือ bar เท่านั้นไม่ใช่ทั้งสองอย่าง

    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 เพิ่งพบคำถามอื่นที่อ้างอิงถึงปัญหาประเภทเดียวกัน

หวังว่านี่จะช่วยได้


1
ฉันไม่เคยเดาเลยว่ามันง่ายมาก! รักคุณ Python 3.6!
bjd2385

Christian Witts คือใครและคำตอบของเขาอยู่ที่ไหน
ijoseph

3
เฮ้ @ joseph คำตอบนี้เก่าแล้วตอนนี้ ฉันไม่แน่ใจว่าคำตอบคืออะไรอีกแล้ว ตอนนี้อาจถูกลบออกไปแล้ว ขอโทษสำหรับสิ่งนั้น!
jlengrand

1
@lengrand คำตอบของคุณยังคงใช้ได้กับฉันหลังจากที่ฉันรู้ว่าจริง ๆ แล้วมันแก้ปัญหาทั้งสองข้อเสนอในคำถาม ( XORโดยทั่วไป) ข้อกังวลแรกของฉันคือคุณแก้ไขได้เพียงหนึ่งในสองเงื่อนไขเท่านั้น
ijoseph

ขอบคุณสำหรับความคิดเห็น. ฉันมีความคิดว่ามันเป็นการแก้ปัญหาทุกอย่าง แต่ไม่แน่ใจอีกต่อไป: D ฉันจะแก้ไขคำตอบตามนั้น!
jlengrand

39

หากคุณต้องการการตรวจสอบที่ไม่ได้จัดทำโดยโมดูลคุณสามารถทำได้ด้วยตนเอง:

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")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.