Python 点击​​ : access option values globally

标签 python python-click

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

我可以改为创建一个全局变量 is_debug 并在接收此标志值的命令函数的开头设置它的值。但这对我来说也不优雅。

是否有更好的方法使用 Click 库使某些选项值可全局访问?

最佳答案

根据您的需要,有两种方法可以做到这一点。他们俩最终都使用了点击 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() 直接从当前线程中提取上下文。从 Click 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

关于Python 点击​​ : access option values globally,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64381222/

相关文章:

Python 应用程序在通过 pip 安装时可以工作,但在直接运行时则不行

Python Click - 仅在父命令成功执行时才执行子命令

python - 如何为点击处理的参数列表指定默认值?

python - 为什么 scipy.ndimage.io.imread 返回 PngImageFile,而不是值数组

python - 或者条件 Python

python - 如何取消设置 Protocol Buffer 字段?

python - 将零个或可变数量的值传递给 Click.Option

Python 单击应用程序所需的参数优先于子命令帮助选项

python - seek and tell 可以在 Python 中使用 UTF-8 编码的文档吗?

python - 从 Python 发送 Outlook 2010 电子邮件