需要使用argparse的两个参数之一


182

鉴于:

import argparse

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

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

我如何

  • 将“ foo,bar”中的至少一项设为强制性:--foo x--bar y并且--foo x --bar y可以
  • 使“ foo,bar”中的一项至多为强制性的:--foo x或者--bar y很好,--foo x --bar y不是

Answers:


296

我认为您正在寻找类似互斥的内容(至少对于问题的第二部分而言)。

这样,仅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()

顺便说一句,只是发现了另一个问题,指的是同样的问题。

希望这可以帮助


1
我从未想过这是如此容易!爱你Python 3.6!
bjd2385

谁是克里斯蒂安·威茨,他的答案在哪里?
ijoseph '18 -4-12

3
嗨@ijoseph,这个答案现在还不错。我不确定答案是什么。现在可能已将其删除。抱歉!
jlengrand18年

1
@jlengrand在我意识到它实际上可以解决问题(XOR,基本上)中提出的两个条件之后,您的答案仍然对我有用。我最初的担心是,您只能解决两个条件之一。
ijoseph '18年

感谢您的反馈。我有一个想法,那就是确实可以解决所有问题,但现在还不确定: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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.