9
クリックで相互排他的なオプショングループを作成するにはどうすればよいですか?私はフラグ "--all"を受け入れるか、 " - color red"のようなパラメータでオプションを取りたいと思っています。pythonの相互排他的なオプショングループ
クリックで相互排他的なオプショングループを作成するにはどうすればよいですか?私はフラグ "--all"を受け入れるか、 " - color red"のようなパラメータでオプションを取りたいと思っています。pythonの相互排他的なオプショングループ
最近、この同じ使用例がありました。これは私が思いついたものです。各オプションについて、競合するオプションのリストを与えることができます。
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ページにこれを記載したいくつかの問題があります。
それのようには見えません。 「すべて」オプションを作成してから、そのオプション内から他のすべての関数を呼び出すことはできませんか? – Charlie
@Charlie:はい、しかし、ユーザーはコマンドラインに "--all --color red"を置くことができ、それは正しいとは思われません。 – Bryce
OK - 詳細を教えてください。もしそうすれば、どうなるのだろう?たぶん、いくつかのサンプルコードを書くことができます。 – Charlie