如何为多个Click命令复用相同参数与选项,消除重复代码?
Click 命令公共参数复用方案
你自己实现的自定义click.Command子类的方案是完全符合官方规范的正确实现,除此之外还有一种更灵活的常用方案可以选择:
方案1:封装公共参数装饰器(推荐大多数场景使用)
这种方式不需要修改命令基类,只需要把重复的参数装饰逻辑打包成自定义装饰器,适合零散命令复用参数的场景,灵活度更高:
import click # 封装公共参数,可叠加任意数量的argument/option def common_params(func): func = click.argument("arg", help="This is my argument")(func) # 额外公共参数直接往下加即可 # func = click.option("--opt", "-o", help="公共选项")(func) return func @click.command() @common_params def cmd1(arg): # 业务逻辑 pass @click.command() @common_params def cmd2(arg): # 业务逻辑 pass
方案2:自定义Command基类(你当前的实现方案)
这种方式适合一整组命令都需要统一挂载相同参数的场景,批量维护更方便,你的实现没有问题,可以直接扩展更多公共参数:
import click class CommonCommand(click.Command): def __init__(self, **kwargs) -> None: super().__init__(**kwargs) # 批量添加公共参数 self.params.append(click.Argument(["arg"], help="This is my argument")) self.params.append(click.Option(["--opt", "-o"], help="公共选项")) @click.group() def main(): pass # 带公共参数的命令 @main.command(cls=CommonCommand) def cmd1(arg, opt): print(f"cmd1接收参数:{arg}, {opt}") @main.command(cls=CommonCommand) def cmd2(arg, opt): print(f"cmd2接收参数:{arg}, {opt}") # 普通命令不受影响 @main.command() def normal_cmd(): print("无公共参数的普通命令")
方案选择建议
- 仅少数几个命令复用少量参数:选方案1,写法更直观,可灵活给不同命令叠加额外参数
- 整组命令都需要统一参数规则:选方案2,修改基类即可批量更新所有命令的参数配置
内容的提问来源于stack exchange,提问作者LDericher
相关产品推荐
相关产品推荐

