设计思路
- 插件函数定义:每个插件函数根据自身需求定义不同参数。
- 注册机制:使用一个字典来存储已注册的插件函数,键为插件名称,值为插件函数本身。
- 动态参数适配:通过
**kwargs
来传递参数,在调用插件函数时,将kwargs
中符合插件函数参数名的参数提取出来传递给插件函数。
- 可插拔式设计模式:使得插件的添加和移除非常方便,只需在注册字典中进行相应操作。
关键代码示例
# 存储插件的字典
plugin_registry = {}
def register_plugin(name):
def wrapper(func):
plugin_registry[name] = func
return func
return wrapper
# 示例插件1
@register_plugin('plugin1')
def plugin1_function(a, b):
return a + b
# 示例插件2
@register_plugin('plugin2')
def plugin2_function(c, d, e=0):
return c * d + e
def execute_plugin(plugin_name, **kwargs):
if plugin_name in plugin_registry:
func = plugin_registry[plugin_name]
# 获取函数参数名
param_names = func.__code__.co_varnames[:func.__code__.co_argcount]
# 提取符合参数名的kwargs
valid_kwargs = {k: v for k, v in kwargs.items() if k in param_names}
return func(**valid_kwargs)
else:
raise ValueError(f"Plugin {plugin_name} not found.")
# 调用示例
result1 = execute_plugin('plugin1', a=1, b=2)
result2 = execute_plugin('plugin2', c=3, d=4, e=5)
print(result1)
print(result2)