2016-05-18 15 views
9

クリックで相互排他的なオプショングループを作成するにはどうすればよいですか?私はフラグ "--all"を受け入れるか、 " - color red"のようなパラメータでオプションを取りたいと思っています。pythonの相互排他的なオプショングループ

+0

それのようには見えません。 「すべて」オプションを作成してから、そのオプション内から他のすべての関数を呼び出すことはできませんか? – Charlie

+1

@Charlie:はい、しかし、ユーザーはコマンドラインに "--all --color red"を置くことができ、それは正しいとは思われません。 – Bryce

+0

OK - 詳細を教えてください。もしそうすれば、どうなるのだろう?たぶん、いくつかのサンプルコードを書くことができます。 – Charlie

答えて

12

最近、この同じ使用例がありました。これは私が思いついたものです。各オプションについて、競合するオプションのリストを与えることができます。

from click import command, option, Option, UsageError 


class MutuallyExclusiveOption(Option): 
    def __init__(self, *args, **kwargs): 
     self.mutually_exclusive = set(kwargs.pop('mutually_exclusive', [])) 
     help = kwargs.get('help', '') 
     if self.mutually_exclusive: 
      ex_str = ', '.join(self.mutually_exclusive) 
      kwargs['help'] = help + (
       ' NOTE: This argument is mutually exclusive with ' 
       ' arguments: [' + ex_str + '].' 
      ) 
     super(MutuallyExclusiveOption, self).__init__(*args, **kwargs) 

    def handle_parse_result(self, ctx, opts, args): 
     if self.mutually_exclusive.intersection(opts) and self.name in opts: 
      raise UsageError(
       "Illegal usage: `{}` is mutually exclusive with " 
       "arguments `{}`.".format(
        self.name, 
        ', '.join(self.mutually_exclusive) 
       ) 
      ) 

     return super(MutuallyExclusiveOption, self).handle_parse_result(
      ctx, 
      opts, 
      args 
     ) 

そして正規optionデコレータを使用するがcls引数渡し:

@command(help="Run the command.") 
@option('--jar-file', cls=MutuallyExclusiveOption, 
     help="The jar file the topology lives in.", 
     mutually_exclusive=["other_arg"]) 
@option('--other-arg', 
     cls=MutuallyExclusiveOption, 
     help="The jar file the topology lives in.", 
     mutually_exclusive=["jar_file"]) 
def cli(jar_file, other_arg): 
    print "Running cli." 
    print "jar-file: {}".format(jar_file) 
    print "other-arg: {}".format(other_arg) 

if __name__ == '__main__': 
    cli() 

Here's a gist 上記のコードが含まれており、それを実行してからの出力を示しています。

これがうまくいかない場合は、click githubページにこれを記載したいくつかの問題があります。

関連する問題