2012-12-17 10 views
14

を私はargparseで、このようなロジックを実装したいと思います:Pythonはargparse:いくつかの互換性のある引数とは排他のグループ

If argument A is selected, the user cannot select arguments B or C. 
B and C can both be selected 

add_mutually_exclusive_groupが、私はこれをしたいと思うものですが、あなたができるだけのように見えるように見えます相互に排他的なグループから1つのオプションを選択するので、3つを相互に排他的なグループに入れることはできません。

argparseでこれを行う方法はありますか?

+0

argparseの後にif? – erikbwork

+2

私は、argparseの素晴らしい点は、あなたのためにエラーメッセージを処理することです。 –

+0

私は相互排他的なグループに 'add_argument_group'を使って通常のグループのオプションを追加することはできますが、これはまったく機能しません(相互に排他的なグループを全く持たないのと同じです)。おそらく、この種のロジックを実装するカスタムアクションを書く方が良いでしょう。それはやりすぎるはずです。 – Bakuriu

答えて

-1

Aの意味を否定し、サブパーザを使用することができます。サブパーザでは、「Aが選択されている場合にのみ、ユーザーはBまたはCを選択できます」という指定を可能にします。

http://docs.python.org/2/library/argparse.html

+3

これは例がないと本当に悪い答えです。 – Oz123

2

あなたは本当に​​が実行された後しかし、あなたがそれを行うことができ、​​でそれを行うことができませんでした。ここで

は一例です:

parser = argparse.ArgumentParser() 

# group 1 
parser.add_argument("-q", "--query", help="query", required=False) 
parser.add_argument("-f", "--fields", help="field names", required=False) 

# group 2 
parser.add_argument("-a", "--aggregation", help="aggregation", 
        required=False) 

私はここにMongoDBを問い合わせるためのコマンドラインラッパーに与えられたオプションを使用しています。 collectionインスタンスは、aggregateメソッドまたはfindメソッドをオプションの引数queryfieldsと一緒に呼び出すことができるため、最初の2つの引数が互換性があり、最後の引数が互換性がない理由がわかります。

は、だから今、私はparser.parse_args()を実行し、それがコンテンツだチェック:もちろん

args = parser().parse_args() 

print args.aggregation 
if args.aggregation and (args.query or args.fields): 
    print "-a and -q|-f are mutually exclusive ..." 
    sys.exit(2) 

、この小さなハックだけの単純な例のために働いていると、それはあなたが相互に多くを持っている場合は、すべての可能なオプションを確認するには悪夢になるだろう排他的なオプションとグループ。その場合は、オプションをコマンドグループに分割する必要があります。そのためには、こちらの提案に従ってください。Python argparse mutual exclusive group

1

Docoptがこのインスタンスで動作する可能性があります。

相互に排他的な要素のパイプを使用します。

my_program (aggregate | find [-q | -f]) 
+0

チームとの一貫性のためにargparseを使用する必要がない場合は、Docoptを使用してください。 argparseを使用する必要がある場合は、別の方法で決定できる人と話し、Docoptを表示してください。 Docoptは、argparseとitilkが基本的に犬を揺らす尻尾であるため、複雑な要件や動作をセットアップするのが素早く簡単です。私は、私が実際にDocoptで必要とする何かを行うことができない単一インスタンスを見つけませんでした。 – TinBane

関連する問題