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



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

考虑以下最小示例:

import click

def check_number(ctx, _, input_):
"""Do some calculations to check the number"""
p = ctx.params
# Print defaults as I see them here.
print('User:', p.get('user', None))
print('Start Date:', p.get('start_date', None))
print('End Date:', p.get('end_date', None))
print('Number:', input_)
# Number is typically a range of numbers that needs to be parsed.
# Here I would revise the input and return whats left after my check
return input_

@click.command()
@click.option('--user','user', default='Default User')
@click.option('--start','start_date', default='2000_0101')
@click.option('--end','end_date',default='2020_0101')
@click.option('--number','number', default=0, callback=check_number)
def main(user, start_date, end_date, number):
"""Do some stuff."""

if __name__ == '__main__':
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 GatherOptions(click.Command):
"""This class makes sure all of the input arguments are gathered and passed through the context for the option callbacks."""
def make_context(self, *args, **kwargs):
ctx = super(GatherOptions, self).make_context(*args, *kwargs)
return ctx
...
@click.command(cls=GatherOptions)  # Add this class here

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

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

要访问默认值,无论执行顺序如何,请在回调代码中使用以下内容:

defaults = {p.name: p.default for p in ctx.command.params}
# To use param values if they exist, uncomment the following line
# defaults.update(ctx.params)

请注意,正如tmwilson26正确注意到的那样,只有Click已经处理过的参数才会出现在ctx.params中。

最新更新