如何将functools.partial创建的函数作为Click子命令添加到cli组
解决Click添加functools.partial创建的子命令问题
你遇到的问题根源是functools.partial生成的对象缺少Click命令所需的__name__、__module__、hidden等属性,导致add_command无法识别。以下是三种可行的解决方式:
方法1:给partial对象补充必要属性
直接为partial对象添加Click校验要求的属性,让它能被命令组识别:
import functools import click @click.group() def cli(): pass @cli.command() def foo(myname="foo"): print(f"I am {myname}") bar = functools.partial(foo, myname="bar") # 补充Click需要的属性 bar.__name__ = "bar" bar.__module__ = __name__ bar.hidden = False # 根据需求设置是否隐藏该命令 cli.add_command(bar, name="bar") if __name__ == "__main__": cli()
方法2:用click.Command手动封装partial
直接创建Click的Command实例,把partial对象作为回调传入,还能复用原命令的参数配置:
import functools import click @click.group() def cli(): pass @cli.command() def foo(myname="foo"): print(f"I am {myname}") bar = functools.partial(foo, myname="bar") # 手动构建Command对象 bar_cmd = click.Command( name="bar", callback=bar, params=foo.params # 复用foo的参数定义,无需重新编写 ) cli.add_command(bar_cmd) if __name__ == "__main__": cli()
方法3:用普通函数包裹partial调用
如果不想处理partial的属性问题,用一个简单的包装函数包裹partial的调用,再把这个包装函数转为Click命令:
import functools import click @click.group() def cli(): pass @cli.command() def foo(myname="foo"): print(f"I am {myname}") bar = functools.partial(foo, myname="bar") # 定义包装函数 def bar_run(): bar() # 将包装函数转为Command并添加到组 cli.add_command(click.command(name="bar")(bar_run)) if __name__ == "__main__": cli()
内容的提问来源于stack exchange,提问作者Owen
相关产品推荐
相关产品推荐

