在函数之间拆分 python 单击选项

Splitting python click options betwen functions

我的代码库有多个脚本,比如 sc1.py 和 sc2.py。他们的代码如下所示(只需将 1 替换为 2 即可想象另一个是什么样的):

@click.command()
@click.option(--op1, default="def1", required=True)
def sc1(op1):
    pass

if __name__ == "__main__":
    sc1()

我想做的是编写一个包装器来处理加载配置文件(并适当处理丢失的配置文件)、配置记录器等问题

例如,记录器需要一些选项,例如日志级别,并且此选项不会出现在任何现有脚本中。我想在包装器级别处理它(因为包装器将处理日志配置等常见问题)。

这就是包装器的样子:

@click.command()
@click.option(--level, default=INFO, required=False)
def wrapper(level, wrapped_main_function):
   # use level to setup logger basic config.
   wrapped_main_function()

然后我会修改脚本中的“main”(sc1.py、sc2.py等):

from wrap_module import wrapper

@click.command()
@click.option(--op1, default="def1", required=True)
def sc1(op1):
    pass

if __name__ == "__main__":
    wrapper(???, sc1)

换句话说,我试图在两个函数之间拆分选项,比如 wrapper 和 sc1,让 wrapper 处理它自己的专用选项,然后调用 sc1,转发剩余的命令行选项。 wrapper 并不知道这些可能是什么选项,因为重点是编写一些通用的东西,可以用于所有脚本并让 wrapper 处理共性。

命令行应如下所示:

python sc.py --op1 something --level debug

我想不出正确的语法来做我想做的事。

我认为您可以通过稍微不同的方法接近您想要的。首先,我们在 common.py 中有以下内容:

import click


def add_common_options(func):
    func = click.option("--level")(func)
    return func


def handle_common_options(level):
    print("log level is", level)

然后在 sc1.py 中,我们有:

import click
from common import add_common_options, handle_common_options


@click.command()
@click.option("--op1")
@add_common_options
def sc1(op1, **common_options):
    handle_common_options(**common_options)
    print("op1 is", op1)


if __name__ == "__main__":
    sc1()

sc2.py 以类似的方式实现。)

这会让你得到你想要的行为。 sc1.py 的帮助输出 看起来像:

Usage: sc1.py [OPTIONS]

Options:
  --op1 TEXT
  --level TEXT
  --help        Show this message and exit.

你可以运行这样的命令行:

$ python sc1.py --op1 foo --level info
log level is info
op1 is foo