Python Click:使用[]将Option对象手动附加到Command实例时,NoSuchOption异常

问题描述 投票:1回答:1
我的代码示例:

import click def std_cb(ctx, param, standardize): if standardize: opt = click.Option(param_decls=['-a'], help='this option only exists when -S is set') else: opt = click.Option(param_decls=['-b'], help='this option only exists when -S is not set') ctx.command.params.append(opt) return standardize @click.command() @click.option('-S', '--standardize/--no-standardize', is_eager=True, is_flag=True, default=False, callback=std_cb) def get_options(standardize, **extra_opts): print(locals()) if __name__ == '__main__': uis = get_options.main(standalone_mode=False)

我要实现的目标是能够使用单击库为给定命令动态创建不同选项,具体取决于对同一命令的渴望标志选项的值。

当我在CLI上以$ python cli_test.py的身份执行上述命令时,将按预期打印到标准输出{'standardize': False, 'extra_opts': {}}。同样,$ python cli_test.py -S打印{'standardize': True, 'extra_opts': {}},也可以预期。

并且当我用--help调用内置的$ python cli_test.py --help选项时,我得到:

Usage: cli_test.py [OPTIONS] Options: -S, --standardize / --no-standardize -b TEXT this option only exists when -S is not set --help Show this message and exit.

[这似乎暗示通过--no-standardize标志通过std_cb回调附加-S特定选项的工作也正常。

类似地,$ python cli_test.py --help -S产生:

Usage: cli_test.py [OPTIONS] Options: -S, --standardize / --no-standardize -a TEXT this option only exists when -S is set --help Show this message and exit.

由于-a标志的出现,现在出现-S选项。

但是,如果我尝试执行$ python cli_test.py -b hello,则会收到错误:click.exceptions.NoSuchOption: no such option: -b

[类似地,尽管$ python cli_test.py -S -a world会在其适用的click.exceptions.NoSuchOption: no such option: -a标志值下显示在帮助页面中,但它们仍会产生-S。>>

我期望从给定的代码示例中看到的当然是$ python cli_test.py -b hello打印{'standardize': True, 'extra_opts': {'b': 'hello'}}

$ python cli_test.py -S -a world打印{'standardize': True, 'extra_opts': {'a': 'world'}}

[在Click docs中,作者确实声明使用@click.option等同于手动创建Option实例并将其附加到Command.params列表。”,所以我不确定我在做什么。错误。

我的代码示例:导入click def std_cb(ctx,param,standardize):如果标准化:opt = click.Option(param_decls = ['-a'],help ='此选项仅在-S ...时存在) >

我不确定您的代码是否应该工作,但是我想知道您是否可以接受我在此处绘制的内容:

import click def require_standardize_set(ctx, param, value): if value and not ctx.params['standardize']: raise click.UsageError('-{} requires that -S is set'.format(param.name)) return value def require_standardize_not_set(ctx, param, value): if value and ctx.params['standardize']: raise click.UsageError('-{} requires that -S is not set'.format(param.name)) return value @click.command() @click.option('-S', '--standardize/--no-standardize', is_flag=True, default=False, is_eager=True) @click.option('-a', help='this option requires that -S is set', callback=require_standardize_set) @click.option('-b', help='this option requires that -S is not set', callback=require_standardize_not_set) def get_options(standardize, **extra_opts): print(locals()) if __name__ == '__main__': uis = get_options.main(standalone_mode=False)

在我看来这将产生相同的结果(除了extra_opts始终同时包含ab,但如果未设置,则具有None的值)。从我的角度来看,这样做的好处是文档总是记录ab。作为用户,我想我会想要的。
python command-line-interface python-click
1个回答
1
投票
我不确定您的代码是否应该工作,但是我想知道您是否可以接受我在此处绘制的内容:
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.