一、问题来源:
self.plugin_manager.hook.sink_data(data=data)
报错如下:
TypeError: HookCaller.call() takes 1 positional argument but 2 were given
二、实验:
在使用 pluggy 这样的插件管理库时,钩子(hooks)通常是通过关键字参数来传递数据的。这样做的好处是:
增强了代码的可读性:调用函数时明确指定参数名,可以让代码更容易理解。
提高了灵活性:如果钩子定义中的参数顺序发生变化,使用关键字参数调用就不会受到影响。
可维护性:当钩子的参数列表在未来可能扩展时,现有的插件调用不需要修改,因为它们已经通过关键字匹配到了正确的参数。
因此,如果你的钩子定义了接受参数的规格,你应该按照钩子的规格使用关键字参数的形式来传递数据。
例如,如果你的钩子定义是这样的
# 假设你有一个钩子规格在某个插件管理器中定义如下
@hookspec
def sink_data(self, data):
pass
假设你有一些数据要通过这个钩子传递
some_data = {'key': 'value'}
# 正确的调用方式应该是
self.plugin_manager.hook.sink_data(data=some_data)
如果你尝试通过位置参数来调用钩子(即不使用关键字参数),你可能会遇到 TypeError 错误,因为 pluggy 期望通过关键字参数来接收数据。
三、结论
钩子必须用关键字来传参