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

Pluggy钩子函数无法接收关键字参数,始终使用默认值

Pluggy钩子kwargs不生效的问题解决

核心问题出在钩子规范(hookspec)的参数签名定义与Pluggy的参数绑定机制不匹配:

你的@hookspec中recursive和reprocess是无默认值的必填位置参数,但调用时传入的是关键字参数(kwargs)。Pluggy会严格按照钩子规范的签名来解析参数,此时它会优先从位置参数(*args)中取值,忽略同名的关键字参数,导致插件实现始终拿到默认值。

修复方案

方案1:修正钩子规范,为可选参数添加默认值

修改plugin_hooks.py中的钩子定义,让参数签名和实现保持一致:

@hookspec
def discover_files(directory: str, recursive: bool = False, reprocess: bool = False) -> list:
    """Discover files in the given directory."""

方案2:调用时改用位置参数传递

如果不想修改钩子规范,可将kwargs转换为位置参数后传入:

# 从kwargs中提取参数按顺序组成args
args = (kwargs['directory'], kwargs['recursive'], kwargs['reprocess'])
result = hook(*args)

推荐方案1,既符合Python参数设计习惯,也能让Pluggy的参数映射逻辑正常工作。

原理说明

Pluggy的参数绑定逻辑完全遵循钩子规范的签名:

  • 若spec中的参数是无默认值的位置参数,Pluggy只会从*args中按顺序取值,无视同名kwargs
  • 只有当spec中的参数定义了默认值(标记为可选参数),Pluggy才会正确匹配并转发传入的关键字参数

你手动调用插件正常,是因为Python自身的参数解析会自动兼容位置参数和关键字参数,但Pluggy为了保证钩子实现与规范的一致性,采用了更严格的绑定规则。

验证

修改钩子规范后重新运行,插件函数中的recursive和reprocess就能正确接收传入的参数值了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:37:23