MST

星途 面试题库

面试题:Python中**kwargs在元编程与设计模式中的应用

假设你正在使用Python开发一个插件系统,插件以函数形式存在,每个插件函数接受不同的参数。你需要设计一个注册机制,使用**kwargs来动态适配不同插件函数的参数,同时要符合可插拔式的设计模式。请详细描述你的设计思路,并给出关键代码示例。
45.4万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 插件函数定义:每个插件函数根据自身需求定义不同参数。
  2. 注册机制:使用一个字典来存储已注册的插件函数,键为插件名称,值为插件函数本身。
  3. 动态参数适配:通过**kwargs来传递参数,在调用插件函数时,将kwargs中符合插件函数参数名的参数提取出来传递给插件函数。
  4. 可插拔式设计模式:使得插件的添加和移除非常方便,只需在注册字典中进行相应操作。

关键代码示例

# 存储插件的字典
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)