gpt4 book ai didi

python - 只有在使用点击时做出选择时才需要一个选项

转载 作者:太空宇宙 更新时间:2023-11-03 14:50:09 25 4
gpt4 key购买 nike

使用 click 时我知道如何定义 multiple choice option .我也知道如何将选项设置为必需的。 But, how can I indicate that an option B is required only if the value of option A is foo?

这是一个例子:

import click

@click.command()
@click.option('--output',
type=click.Choice(['stdout', 'file']), default='stdout')
@click.option('--filename', type=click.STRING)
def main(output, filename):
print("output: " + output)
if output == 'file':
if filename is None:
print("filename must be provided!")
else:
print("filename: " + str(filename))

if __name__ == "__main__":
main()

如果output 选项是stdout,则不需要filename。但是,如果用户选择 outputfile,则必须提供另一个选项 filename。点击支持这种模式吗?

在函数的开头我可以添加如下内容:

if output == 'file' and filename is None:
raise ValueError('When output is "file", a filename must be provided')

但我对是否有更好/更清洁的解决方案感兴趣。

最佳答案

在这个例子的特殊情况下,我认为一个更简单的方法是去掉 --output,如果 --未指定文件名,如果指定了--filename,则使用它代替stdout

但假设这是一个人为的示例,您可以继承 click.Option 以允许 Hook 到点击处理中:

自定义类:

class OptionRequiredIf(click.Option):

def full_process_value(self, ctx, value):
value = super(OptionRequiredIf, self).full_process_value(ctx, value)

if value is None and ctx.params['output'] == 'file':
msg = 'Required if --output=file'
raise click.MissingParameter(ctx=ctx, param=self, message=msg)
return value

使用自定义类:

要使用自定义类,将其作为 cls 参数传递给选项装饰器,如:

@click.option('--filename', type=click.STRING, cls=OptionRequiredIf)

测试代码:

import click

@click.command()
@click.option('--output',
type=click.Choice(['stdout', 'file']), default='stdout')
@click.option('--filename', type=click.STRING, cls=OptionRequiredIf)
def main(output, filename):
print("output: " + output)
if output == 'file':
if filename is None:
print("filename must be provided!")
else:
print("filename: " + str(filename))


main('--output=file'.split())

结果:

Usage: test.py [OPTIONS]

Error: Missing option "--filename". Required if --output=file

关于python - 只有在使用点击时做出选择时才需要一个选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46440950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com