You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Click 8.x版本中result_callback无法执行问题求助

Click 8.x中MultiCommand的result_callback不执行的问题解决

问题原因

Click 8.0+版本对MultiCommand的回调逻辑做了调整:当使用继承自MultiCommand的命令(比如你的PluginCommands)时,直接给顶级命令实例(比如foo)设置result_callback不会触发——因为MultiCommand本身仅负责调度子命令,它自身的执行逻辑(你的foo函数体是空的)不会被触发,自然不会调用绑定的回调。而Click 7.x中存在的隐式触发顶级命令回调的逻辑在新版本中被移除了。

解决方法

方法一:给子命令单独绑定回调

如果子命令数量不多,可以直接把回调绑定到每个子命令上:

@foo.command('bar')
def bar(ctx):
    do_stuff()

# 把回调绑定到子命令bar上
bar.result_callback = some_mailing_function

方法二:重写MultiCommand的invoke方法统一处理

如果有多个子命令,不想逐个绑定,可以在自定义的PluginCommands类中重写invoke方法,在子命令执行完成后统一触发回调:

class PluginCommands(click.MultiCommand):
    def invoke(self, ctx):
        # 先执行子命令并获取结果
        result = super().invoke(ctx)
        # 如果当前实例有result_callback,就调用它
        if hasattr(self, 'result_callback'):
            self.result_callback(result, ctx)
        return result

这样你原来代码中foo.result_callback = some_mailing_function的写法就能正常生效,所有子命令执行后都会触发这个回调。

内容的提问来源于stack exchange,提问作者brillenheini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:12:17