仅当使用单击时做出选择时才需要选项

2024-02-07

使用时click http://click.pocoo.org/5/我知道如何定义多项选择选项 http://click.pocoo.org/5/options/#choice-options。我也知道如何将选项设置为required一。但是,我怎样才能表明一个选项B仅当选项值时才需要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()

If the output选项是stdout, then filename不需要。但是,如果用户选择output to be file,然后是另一个选项filename必须提供。 click 支持这种模式吗?

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

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

但我感兴趣是否有更好/更干净的解决方案。


在这个例子的特殊情况下,我认为一个更简单的方法是摆脱--output,并简单地假设stdout if --filename未指定并且如果--filename已指定,然后使用它代替stdout.

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

定制类:

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())

Results:

Usage: test.py [OPTIONS]

Error: Missing option "--filename".  Required if --output=file
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅当使用单击时做出选择时才需要选项 的相关文章

随机推荐