是否可以为多个命令重用 python @click.option 装饰器?
Is it possible to reuse python @click.option decorators for multiple commands?
我有两个 Python CLI 工具,它们共享一组通用的 click.options。目前常用选项重复:
@click.command()
@click.option('--foo', is_flag=True)
@click.option('--bar', is_flag=True)
@click.option('--unique-flag-1', is_flag=True)
def command_one():
pass
@click.command()
@click.option('--foo', is_flag=True)
@click.option('--bar', is_flag=True)
@click.option('--unique-flag-2', is_flag=True)
def command_two():
pass
是否可以将通用选项提取到可应用于每个函数的单个装饰器中?
您可以构建自己的装饰器来封装常用选项:
def common_options(function):
function = click.option('--unique-flag-1', is_flag=True)(function)
function = click.option('--bar', is_flag=True)(function)
function = click.option('--foo', is_flag=True)(function)
return function
@click.command()
@common_options
def command():
pass
这里是一个装饰器,它使用与上一个答案相同的原理:
def group_options(*options):
def wrapper(function):
for option in reversed(options):
function = option(function)
return function
return wrapper
opt_1 = click.option("--example1")
opt_2 = click.option("--example2")
opt_3 = click.option("--example3")
@cli.command()
@click.option("--example0")
@group_options(opt_1, opt_2, opt_3)
def command(example0, example1, example2, example3):
pass
如果要给这样的函数加参数,需要再包裹一次:
def common_options(mydefault=True):
def inner_func(function):
function = click.option('--unique-flag-1', is_flag=True)(function)
function = click.option('--bar', is_flag=True)(function)
function = click.option('--foo', is_flag=True, default=mydefault)(function)
return function
return inner_func
@click.command()
@common_options(mydefault=False)
def command():
pass
如果你想保留 click 的选项装饰器语法,你可以这样实现你的装饰器:
import functools
def common_options(f):
@click.option('--foo', is_flag=True)
@click.option('--bar', is_flag=True)
@functools.wraps(f)
def wrapper_common_options(*args, **kwargs):
return f(*args, **kwargs)
return wrapper_common_options
@click.command()
@common_options
@click.option('--unique-flag-1', is_flag=True)
def command_one():
pass
我有两个 Python CLI 工具,它们共享一组通用的 click.options。目前常用选项重复:
@click.command()
@click.option('--foo', is_flag=True)
@click.option('--bar', is_flag=True)
@click.option('--unique-flag-1', is_flag=True)
def command_one():
pass
@click.command()
@click.option('--foo', is_flag=True)
@click.option('--bar', is_flag=True)
@click.option('--unique-flag-2', is_flag=True)
def command_two():
pass
是否可以将通用选项提取到可应用于每个函数的单个装饰器中?
您可以构建自己的装饰器来封装常用选项:
def common_options(function):
function = click.option('--unique-flag-1', is_flag=True)(function)
function = click.option('--bar', is_flag=True)(function)
function = click.option('--foo', is_flag=True)(function)
return function
@click.command()
@common_options
def command():
pass
这里是一个装饰器,它使用与上一个答案相同的原理:
def group_options(*options):
def wrapper(function):
for option in reversed(options):
function = option(function)
return function
return wrapper
opt_1 = click.option("--example1")
opt_2 = click.option("--example2")
opt_3 = click.option("--example3")
@cli.command()
@click.option("--example0")
@group_options(opt_1, opt_2, opt_3)
def command(example0, example1, example2, example3):
pass
如果要给这样的函数加参数,需要再包裹一次:
def common_options(mydefault=True):
def inner_func(function):
function = click.option('--unique-flag-1', is_flag=True)(function)
function = click.option('--bar', is_flag=True)(function)
function = click.option('--foo', is_flag=True, default=mydefault)(function)
return function
return inner_func
@click.command()
@common_options(mydefault=False)
def command():
pass
如果你想保留 click 的选项装饰器语法,你可以这样实现你的装饰器:
import functools
def common_options(f):
@click.option('--foo', is_flag=True)
@click.option('--bar', is_flag=True)
@functools.wraps(f)
def wrapper_common_options(*args, **kwargs):
return f(*args, **kwargs)
return wrapper_common_options
@click.command()
@common_options
@click.option('--unique-flag-1', is_flag=True)
def command_one():
pass