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
相关产品推荐
相关产品推荐

