在函数之间拆分 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
我的代码库有多个脚本,比如 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