我有这段代码可以正常工作:
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
应该接收三个参数,但它没有参数被调用。这是如何运作的? 最佳答案
如评论中所述,这由装饰者注意。 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)
这就是神秘的三个论点的来源。
关于python - 使用click时主要功能的命令行参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57045515/