微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python Click:全局访问选项值

如何解决Python Click:全局访问选项值

我有一个为基本命令定义的标志--debug/--no-debug。该标志将影响程序中许多操作的行为。现在,我发现自己在各处传递了此标志作为函数参数,这似乎并不优雅。特别是当我需要在深度调用堆栈中访问此标志时,必须将此参数添加到堆栈中的每个单个函数中。

我可以改而创建一个全局变量is_debug,并在接收该标志值的命令函数的开始处设置其值。但这在我看来也不是很优雅。

是否有更好的方法可以使某些选项值通过点击库在全球范围内访问?

解决方法

有两种方法,具体取决于您的需求。他们两个最终都点击了Context

我个人是选项2 的粉丝,因为那样我就不必修改函数签名(而且我很少编写多线程程序)。听起来也更像您在寻找什么。

选项1:将上下文传递给函数

使用click.pass_context装饰器将点击上下文传递给函数。

文档:

# test1.py
import click


@click.pass_context
def some_func(ctx,bar):
    foo = ctx.params["foo"]
    print(f"The value of foo is: {foo}")


@click.command()
@click.option("--foo")
@click.option("--bar")
def main(foo,bar):
    some_func(bar)


if __name__ == "__main__":
    main()
$ python test1.py --foo 1 --bar "bbb"
The value of foo is: 1

选项2:click.get_current_context()

直接通过click.get_current_context()从当前线程中拉上下文。从5.0开始可用。

文档:

注意:仅当您在当前线程(与最初用于设置点击命令的线程相同)中时,此方法才有效。

# test2.py
import click


def some_func(bar):
    c = click.get_current_context()
    foo = c.params["foo"]
    print(f"The value of foo is: {foo}")


@click.command()
@click.option("--foo")
@click.option("--bar")
def main(foo,bar):
    some_func(bar)


if __name__ == "__main__":
    main()
$ python test2.py --foo 1 --bar "bbb"
The value of foo is: 1
,

--debug或与日志记录有关的其他情况下,应使用logging module。使用logging,您可以在root命令中设置程序的详细级别,然后忽略它。

click contexts对于将数据向下传递给子命令很有用。如果只有一个命令,这基本上是没有用的。

无论何时执行Click命令,都会创建一个Context对象,该对象保存此特定调用的状态。它记住已解析的参数,创建该命令的命令,在函数末尾需要清除哪些资源等等。它还可以选择保存应用程序定义的对象。

最后,如果您碰巧有许多需要相同数据的函数,也许是时候将这些函数重构为类的方法了。当然,情况并非总是如此,并且肯定不是--debug的情况。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。