使用click时主要功能的命令行参数

时间:2019-07-15 18:44:30

标签: python arguments click python-click

我有此代码可以正常工作:

import click

@click.command(context_settings=dict(help_option_names=['-h', '--help']))
@click.option('--team_name', required=True, help='Team name')
@click.option('--input_file', default='url_file.txt', help='Input file name for applications, URLs')
@click.option('--output_file', default='test_results_file.txt', help='Output file name to store test results')
def main(team_name, input_file, output_file):
    # function body

if __name__ == '__main__':
    main()                  # how does this work?

如您所见,main被调用时没有任何参数,尽管它应该接收三个参数。如何运作?

1 个答案:

答案 0 :(得分:1)

正如评论中提到的那样,这是装饰者要注意的。 click.command装饰器将函数转换为click.Command的实例。

每个选项装饰器都会构建click.Option的实例,并将其附加到click.Command对象,以供以后使用。

click.Command对象实现了__call__ method,该调用由您对main()的调用所调用。

def __call__(self, *args, **kwargs):
    """Alias for :meth:`main`."""
    return self.main(*args, **kwargs)

这非常简单,只需调用click.Command.main()

click.Command.main()顶部附近是:

if args is None:
    args = get_os_args()
else:
    args = list(args)

此代码从命令行获取argv或使用提供的args列表。除其他事项外,此方法中的其他代码还将命令行解析为上下文,并最终将calling of your main()与先前构建的click.Option实例中的值进行比较:

with self.make_context(prog_name, args, **extra) as ctx:
    rv = self.invoke(ctx)

这是神秘的3个论点的来源。