我的代码库有多个脚本,比如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()
然后我会修改";主";在脚本(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,转发剩余的命令行选项。一直以来,包装器都不知道这些选项可能是什么,因为关键是编写一些通用的东西,可以用于所有脚本,并让包装器处理共性。
命令行应该看起来像:
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