Python单击-在回调期间检索其他参数

Python单击-在回调期间检索其他参数,python,python-3.x,command-line-interface,python-click,Python,Python 3.x,Command Line Interface,Python Click,在对特定参数进行回调期间,从Python的click模块(Version6.7在Python 3.6上运行)访问其他输入参数的默认值时遇到问题。回调的目标是基于所有其他输入解析一组数字,并将其作为输入参数返回给函数。但是,根据从命令行调用的方式,单击上下文无法访问默认参数,甚至无法访问某些命令行输入,具体取决于它们的使用顺序。现在,这个问题的一个解决方案可能是在函数中处理这个解析,但是我觉得应该可以在回调中这样做,所以如果可能的话,我想尝试让它工作 考虑以下最小示例: 导入单击 def检查编号(

在对特定参数进行回调期间,从Python的click模块(Version6.7Python 3.6上运行)访问其他输入参数的默认值时遇到问题。回调的目标是基于所有其他输入解析一组数字,并将其作为输入参数返回给函数。但是,根据从命令行调用的方式,单击上下文无法访问默认参数,甚至无法访问某些命令行输入,具体取决于它们的使用顺序。现在,这个问题的一个解决方案可能是在函数中处理这个解析,但是我觉得应该可以在回调中这样做,所以如果可能的话,我想尝试让它工作

考虑以下最小示例:

导入单击
def检查编号(ctx,输入):
“”“进行一些计算以检查数字”“”
p=ctx.params
#打印我在这里看到的默认值。
打印('User:',p.get('User',None))
打印('开始日期:',p.get('开始日期',无))
打印('结束日期:',p.get('结束日期',无))
打印('编号:',输入\)
#数字通常是需要解析的数字范围。
#在这里,我将修改输入并返回检查后剩下的内容
返回输入_
@click.command()命令
@单击.option('--user',user',default='default user')
@单击.option('--start',start\u date',default='2000\u 0101')
@单击.option('--end',end\u date',默认值='2020\u 0101')
@单击.option('--number',number',默认值=0,回调=check\u number)
def main(用户、开始日期、结束日期、编号):
“做点什么。”
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
在不调用任何选项的情况下运行脚本将按预期检索默认值

> ./click_context_problem.py
User: Default User
Start Date: 2000_0101
End Date: 2020_0101
Number: 0
但是,如果我开始添加输入参数,它将无法恢复默认值。例如:

> ./click_context_problem.py --number=1
User: None
Start Date: None
End Date: None
Number: 1
现在,如果我将一些输入添加到命令行中,它可以看到这些输入,但只有在
--number
选项之前,它才能看到这些输入,如下所示:

> ./click_context_problem.py --user=me --number=1
User: me
Start Date: None
End Date: None
Number: 1

> ./click_context_problem.py --number=1 --user=me
User: None
Start Date: None
End Date: None
Number: 1
我在某处看到了一个建议的解决方案(很遗憾,我再也找不到了),它建议创建一个
click.Command
子类,如下所示:

class选项(单击.Command):
“”“此类确保收集所有输入参数并通过选项回调的上下文传递。”“”
定义生成上下文(self、*args、**kwargs):
ctx=super(GatherOptions,self)。生成上下文(*args,*kwargs)
返回ctx
...
@单击.command(cls=GatherOptions)#在此处添加此类

然而,我不太明白这是怎么回事,因为对超级类的调用似乎没有任何改变。但是,也许可以通过其他方式调用
make\u context
方法来访问默认值。在任何情况下,它都不会改变我的程序的行为,不管它是否存在。

已经很晚了,但这可能会帮助其他人解决同样的问题: 同时具有属性和(未记录的)方法。后一种方法还返回帮助选项(如果存在)

要访问默认值而不考虑执行顺序,请在回调代码中使用以下命令:

defaults={p.name:ctx.command.params中p的p.default}
#要使用参数值(如果存在),请取消注释以下行
#defaults.update(ctx.params)
请注意,正如tmwilson26正确注意到的,只有已通过单击处理的参数才会出现在
ctx.params