【发布时间】:2020-06-23 15:08:09
【问题描述】:
在对特定对象进行回调期间,我在从 Python 的 click 模块(6.7 版在 Python 3.6 上运行)访问其他输入参数的默认值时遇到问题范围。我的回调的目标是根据所有其他输入解析一组数字,并将其作为输入参数返回给函数。但是,根据从命令行调用事物的方式,单击上下文无法访问默认参数,甚至无法访问某些命令行输入,具体取决于它们的使用顺序。现在,这个问题的解决方案可能是在函数内处理这个解析,但我觉得应该可以在回调中做到这一点,所以我想尽可能让它工作。
考虑以下最小示例:
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 方法以访问默认值。无论如何,无论是否存在,它都不会改变我的程序的行为。
【问题讨论】:
标签: python python-3.x command-line-interface python-click