2017-01-17 7 views
0

私は書き込みするlilプログラムにparser = argparse.ArgumentParserを使用しようとしています。argparseを使用して必要な引数のグループを1つだけ受け入れます。

プログラムは、入力EITHER( txtファイル)OR( OPT1 && OPT2 && OPT3 )へのパスとして受け入れます。

意味txtファイルを入力として使用したい場合、optと、optを入力した場合は、すべて3を指定して、a path to a txt fileを入力する必要がありません。

私はadd_mutually_exclusive_groupを使用しようとしましたが、第2の引数グループはグループそのものであるため、どのようにしたらよいかわかりません。

これは私がこれまで試したものです:

import argparse 
parser = argparse.ArgumentParser(description='this is the description',) 

root_group = parser.add_mutually_exclusive_group() 

group_list = root_group.add_mutually_exclusive_group() 
group_list.add_argument('-path', help='path to the txt file') 

group_list = root_group.add_mutually_exclusive_group() 
group_list.add_argument('-opt1', help='opt1') 
group_list.add_argument('-opt2', help='opt2') 
group_list.add_argument('-opt3', help='opt3') 

args = parser.parse_args() 

-

python tests.py -path txt -opt1 asdasd 
usage: tests.py [-h] [[-path PATH] [-opt1 OPT1 | -opt2 OPT2 | -opt3 OPT3] 
tests.py: error: argument -opt1: not allowed with argument -path 

pathoptのいずれかで許可されていません - それは私が欲しいまさにです。

しかし、私もユーザーが1を提供した場合は、opt彼はそれらのすべてを提供する必要があります。

少なくとも1つのグループに満足してもらいたい。

+1

あなたが試したことを示して、それがどのように適切でないか説明してください。 –

+0

最初の投稿を編集しました。ありがとう –

+0

あなたのタイトルは誤解を招く恐れがあります。あなたはオプションのセットのすべてまたは何も必要としません。 –

答えて

0

相互排他的なグループは、ネスト用に設計されていません。それはあなたのコードを受け入れますが、ネット効果は4つの引数を排他的にします。私は、ネストグループを定義し、グループ内のanyまたはand操作を可能探ってきたが、それは一つだけpathの、opt1opt2など

を受け入れる、このような特徴は、長い道のりオフになっています。

ユーザーは、すべての3 --optを提供しなければならないので、私は1つの引数にすることを凝縮することをお勧めしたい:

root_group.add_argument('--opt', nargs=3) 
root_group.add_argument('--path') 

使い方が

usage: tests.py [-h] [--path PATH | --opt OPT OPT OPT] 

コントラストのようになりますことができます仮想的な用法nested inclusive groups

[-path PATH | [-opt1 OPT1 & -opt2 OPT2 & -opt3 OPT3]] 

========= ==タプルmetavarで

を、使用量はに洗練することができます。

g.add_argument('--opt',nargs=3,metavar=('OPT1','OPT2','OPT3')) 

usage: ipython3 [-h] [--path PATH | --opt OPT1 OPT2 OPT3] 

=============

あなたの他のオプションは、カスタムを書くことですusageを実行し、解析後に独自の論理テストを実行します。

関連する問題