python中互斥的选项组单击

python中互斥的选项组单击,python,python-click,Python,Python Click,如何在单击中创建互斥选项组?我想要么接受标志“-all”,要么选择参数为“-color red”的选项;这就是我想到的。对于每个选项,您可以给出冲突选项的列表 从单击导入命令、选项、选项、使用错误 类MutuallyExclusiveOption(选项): 定义初始化(self,*args,**kwargs): self.mutual_exclusive=set(kwargs.pop('mutual_exclusive',[])) help=kwargs.get('help','') 如果自相矛

如何在单击中创建互斥选项组?我想要么接受标志“-all”,要么选择参数为“-color red”的选项;这就是我想到的。对于每个选项,您可以给出冲突选项的列表

从单击导入命令、选项、选项、使用错误
类MutuallyExclusiveOption(选项):
定义初始化(self,*args,**kwargs):
self.mutual_exclusive=set(kwargs.pop('mutual_exclusive',[]))
help=kwargs.get('help','')
如果自相矛盾:
ex_str=','.join(自相斥)
kwargs['help']=help+(
'注意:此参数与'
'参数:['+ex_str+']
)
super(MutuallyExclusiveOption,self)。\uuuuu init\uuuuu(*args,**kwargs)
def handle_parse_结果(self、ctx、opts、args):
如果选项中的self.mutual_.exclusive.intersection(opts)和self.name:
提高使用率错误(
“非法使用:`{}`与互斥”
“参数`{}`..”格式(
姓名,
“,”连接(自排斥)
)
)
返回super(MutuallyExclusiveOption,self)。处理解析结果(
ctx,
选择,
args
)
然后使用常规
选项
decorator,但传递
cls
参数:

@command(help=“运行命令”)
@选项('--jar file',cls=MutuallyExclusiveOption,
help=“拓扑所在的jar文件。”,
互斥=[“其他参数”])
@选项('--其他参数',
cls=MutuallyExclusiveOption,
help=“拓扑所在的jar文件。”,
互斥=[“jar\u文件”])
def cli(jar_文件,其他_参数):
打印“正在运行cli”
打印“jar文件:{}”。格式(jar_文件)
打印“其他参数:{}”。格式(其他参数)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
cli()
它包括上面的代码,并显示运行它的输出

如果这对您不起作用,那么在click github页面上也有一些(已关闭的)问题提到了这一点,您可以使用一些想法


您可以使用以下软件包:

应用程序帮助:

$ app.py --help
Usage: app.py [OPTIONS]

Options:
  Grouped options: [mutually_exclusive, required]
                                  Group description
    --all
    --color TEXT
  --help                          Show this message and exit.
您可以使用添加选项组和约束以单击的包。在Cloup中,有两个选项可以解决此问题

免责声明:我是该软件包的作者

选项1:@选项组 使用
@option\u group
定义选项组时,每个组中的选项都显示在单独的帮助部分(如argparse中)。您可以将约束(如
互斥
)应用于选项组,如下所示:

来自cloup导入命令、选项、选项组
从cloup.constraints导入互斥
@命令()
@选项组(
“颜色选项”,
选项('--all',all_colors',is_flag=True),
选项('--color'),
约束=互斥
)
def cmd(**kwargs):
印刷品(kwargs)
帮助将是:

用法:cmd[选项] 颜色选项[相互排斥]: --全部 --彩色文本 其他选择: --帮助显示此消息并退出。
选项2:@约束 如果不希望选项组显示在命令帮助中,可以使用
@constraint
并通过其(目标)名称指定受约束的选项:

来自cloup导入命令,选项
从cloup.constraints导入约束,互斥
@命令()
@选项('--all',all_colors',is_flag=True)
@选项('--color')
@约束(互斥,[“所有颜色”,“颜色])
def cmd(**kwargs):
印刷品(kwargs)
以这种方式定义的约束可以记录在命令帮助中!默认情况下禁用此功能,但通过将
show_constraints=True
传递到
@命令
可以轻松启用此功能。结果是:

用法:cmd[选项] 选项: --全部 --彩色文本 --帮助显示此消息并退出。 限制条件: {--all,--color}相互排斥
错误消息 在这两种情况下,如果运行
cmd--all--color red
,您将得到:

用法:cmd[选项] 请尝试“cmd--help”以获取帮助。 错误:以下参数相互排斥: --全部 --颜色 其他限制 Cloup定义的约束应涵盖99.9%的需求。它甚至支持条件约束

例如,如果用户必须提供一个互斥选项,请在上面的示例中将
互斥
替换为
require(1)


您可以找到所有可用的约束。

看起来不像。你就不能创建一个“all”选项,然后从该选项中调用所有其他函数吗?@Charlie:是的,但是用户可以在命令行上放置“-all--color red”,这似乎不对。好的,告诉我更多。如果他们那样做会发生什么?也许你可以写一些示例代码。这看起来很有希望,而且比前面的示例更简洁。我将尝试一下(并可能将其提升为“最有帮助”)。谢谢。@Bryce谢谢。我是这个软件包的维护者,所以如果您愿意,请毫不犹豫地告诉我任何问题以及您使用它的经验。:)
$ app.py --help
Usage: app.py [OPTIONS]

Options:
  Grouped options: [mutually_exclusive, required]
                                  Group description
    --all
    --color TEXT
  --help                          Show this message and exit.