如何优雅复用Click库中重复的@click.option()参数?
解决Click命令重复选项的优雅方式
可以用以下几种简洁的方式避免重复定义--foo选项:
方式一:用functools.partial封装重复选项
直接把click.option的固定参数(包括关键字参数)预先绑定,生成可复用的装饰器,完全不需要拆分args和kwargs:
import click from functools import partial # 封装带required=True的--foo选项 required_foo_option = partial(click.option, '--foo', required=True) @click.command() @required_foo_option() def bar1(foo: str) -> None: print(f"bar1: {foo}") @click.command() @required_foo_option() def bar2(foo: str) -> None: print(f"bar2: {foo}") if __name__ == '__main__': bar1() # bar2()
方式二:自定义装饰器函数
如果觉得partial不够直观,自己写个简单的装饰器,用法更简洁:
import click def required_foo_option(func): return click.option('--foo', required=True)(func) @click.command() @required_foo_option def bar1(foo: str) -> None: print(f"bar1: {foo}") @click.command() @required_foo_option def bar2(foo: str) -> None: print(f"bar2: {foo}")
方式三:组合多个重复选项(扩展场景)
如果有多个重复选项,可以把它们组合成一个装饰器链,一次性应用到所有命令:
import click from functools import partial, compose # 定义多个重复选项 required_foo = partial(click.option, '--foo', required=True) optional_bar = partial(click.option, '--bar', default='default') # 组合成一个通用装饰器 common_options = compose(required_foo(), optional_bar()) @click.command() @common_options def bar1(foo: str, bar: str) -> None: print(f"bar1: {foo}, {bar}") @click.command() @common_options def bar2(foo: str, bar: str) -> None: print(f"bar2: {foo}, {bar}")
内容的提问来源于stack exchange,提问作者Håkon Hægland
相关产品推荐
相关产品推荐

