argparseを使用して2つの引数のいずれかを要求する


183

与えられた:

import argparse

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

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

どうやって

  • 「foo、bar」の少なくとも1つを必須にする:--foo x--bar yおよび--foo x --bar y問題ありません
  • せいぜい「foo、bar」の1つを必須にする--foo x--bar y、問題--foo x --bar yありません。

回答:


297

私はあなたが相互排除のようなものを探していると思います(少なくともあなたの質問の2番目の部分のために)。

この方法では、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

3
こんにちは@ijoseph、この答えは今ではかなり古いです。答えがどうなったのかよくわかりません。おそらく今では削除されています。そのために残念!
jlengrand 2018

1
@jlengrandあなたの回答は、質問で提案された両方の条件を実際に解決することに気付いた後も引き続き機能します(XOR基本的に)。私の最初の懸念は、あなたが解決したのは2つの条件のうち1つだけであるということでした。
ijoseph

フィードバックをお寄せいただきありがとうございます。私はそれが本当にすべてを解決していると思っていましたが、これ以上確信が持てませんでした:D。それに応じて答えを編集します!
jlengrand 2018

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.