Python Click:NoSuchOption使用手动将选项对象附加到命令实例时出现异常
我的代码示例:Python Click:NoSuchOption使用手动将选项对象附加到命令实例时出现异常,python,command-line-interface,python-click,Python,Command Line Interface,Python Click,我的代码示例: 导入单击 def标准cb(ctx、参数、标准化): 如果标准化: opt=click.Option(参数decls=['-a'], help='仅当设置了-S'时,此选项才存在') 其他: opt=click.Option(参数decls=['-b'], help='仅当未设置-S'时,此选项才存在') ctx.command.params.append(opt) 退货标准化 @click.command()命令 @click.option('-S','-standard/-no
导入单击
def标准cb(ctx、参数、标准化):
如果标准化:
opt=click.Option(参数decls=['-a'],
help='仅当设置了-S'时,此选项才存在')
其他:
opt=click.Option(参数decls=['-b'],
help='仅当未设置-S'时,此选项才存在')
ctx.command.params.append(opt)
退货标准化
@click.command()命令
@click.option('-S','-standard/-no-standarding',为_=True,
is_flag=True,default=False,callback=std_cb)
def get_选项(标准化,**额外选项):
打印(局部变量())
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
uis=get\u options.main(独立\u模式=False)
我试图实现的是能够根据使用click库的同一命令的“渴望”标志选项的值,为给定命令动态创建不同的选项
当我在CLI上以$python CLI_test.py
的形式执行上述命令时,这将按预期打印到stdout{'standarding':False,'extra_opts':{}
。类似地,$python cli_test.py-S
也应打印{'standarding':True,'extra_opts':{}}
当我使用$python cli_test.py--help
调用内置的--help
选项时,我得到:
用法:cli_test.py[选项]
选项:
-S、 --标准化/--无标准化
-b文本仅当未设置-S时,此选项才存在
--帮助显示此消息并退出。
这似乎表明,通过std_cb
回调为-S
标志附加的--no-standarding
特定选项也在工作
类似地,$python cli_test.py--help-S
,生成:
用法:cli_test.py[选项]
选项:
-S、 --标准化/--无标准化
-仅当设置了-S时,此选项才存在文本
--帮助显示此消息并退出。
现在,由于出现了-S
标志,出现了-a
选项
但是,如果我尝试执行$python cli_test.py-b hello
,我会得到错误:click.exceptions.NoSuchOption:没有这样的选项:-b
类似地,$python cli_test.py-S-a world
生成click.exceptions.NoSuchOption:没有这样的选项:-a
,尽管它们在帮助页面中显示在其适用的-S
标志值下
我期望从给定的代码示例中看到的当然是,$python cli_test.py-b hello
打印{'standarding':True,'extra_opts':{'b':'hello'}
和$python cli_test.py-S-a world
打印{'standarized':True,'extra_opts':{'a':'world'}
在中,作者确实声明使用
@click.option
“相当于手动创建一个选项实例并将其附加到命令.params
列表中”,因此我不确定我做错了什么。我不确定您的代码是否正常工作,但我想知道你是否能接受我在这里画的东西:
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)
在我看来,这似乎产生了相同的结果(除了
额外选项
始终包括a
和b
,但如果未设置,则值为None
)。从我的观点来看,一个好处是文档总是同时记录A
和b
。作为一个用户,我想我会想要的。这也是我考虑过的。然而,它并没有达到我想要的效果,因为我想要的另一个应用程序是能够基于渴望标志的值动态地为一组共享选项设置不同的默认值。无论如何,谢谢你的尝试,给了你一票。