如何让两个辅助函数返回不同值?附Python插件注册代码片段
解决两个辅助函数返回不同数值的问题
嘿,我来帮你搞定这个问题!首先看你给出的代码,核心问题在于全局固定的priority变量——所有插件函数都被注册到同一个优先级的扩展点里,这就没法区分不同的辅助函数让它们返回不同值。咱们一步步修改代码来实现需求:
第一步:修复原代码bug并扩展功能
先补全并修正你提供的代码,主要做这几个关键改动:
- 让
PluginFunctions.register支持自定义优先级参数,不再依赖全局固定值 - 修正
ExtensionPoint.unregister_module的判断逻辑(原代码里的匹配项搞反了) - 补全
PluginFunctions.unregister方法 - 添加获取指定优先级函数的方法,方便调用不同辅助函数
完整代码如下:
from collections import defaultdict class ExtensionPoint: def __init__(self): self.__items = [] def register(self, module, item): self.__items.append((module, item)) def unregister_module(self, name): # 修正:过滤掉模块名称匹配的项,假设module是模块对象,取__name__属性 self.__items = [item for item in self.__items if item[0].__name__ != name] def get_items(self): # 添加获取所有注册项的方法,返回函数列表 return [item[1] for item in self.__items] class PluginFunctions: def __init__(self): self.functions = defaultdict(ExtensionPoint) def register(self, module, item, priority=1): # 添加priority参数,默认值为1 self.functions[priority].register(module, item) def unregister(self, item, priority=1): # 根据优先级和函数项移除目标 target_ext = self.functions.get(priority) if target_ext: target_ext._ExtensionPoint__items = [ (mod, func) for mod, func in target_ext._ExtensionPoint__items if func != item ] def get_functions_by_priority(self, priority): # 获取指定优先级下的所有函数 return self.functions[priority].get_items()
第二步:注册两个返回不同数值的辅助函数
现在咱们注册两个辅助函数,分别放到不同的优先级里,让它们返回不同值:
# 定义两个返回不同数值的辅助函数 def helper_func1(): return 100 # 返回第一个目标数值 def helper_func2(): return 200 # 返回第二个目标数值 # 初始化插件管理器并注册函数 plugin_manager = PluginFunctions() # 把helper_func1注册到优先级1,helper_func2注册到优先级2 plugin_manager.register(__name__, helper_func1, priority=1) plugin_manager.register(__name__, helper_func2, priority=2) # 测试调用,验证返回值 funcs_priority1 = plugin_manager.get_functions_by_priority(1) funcs_priority2 = plugin_manager.get_functions_by_priority(2) print(funcs_priority1[0]()) # 输出:100 print(funcs_priority2[0]()) # 输出:200
关键改动说明
- 让
register方法支持自定义priority,这样不同的辅助函数可以被归类到不同的扩展点 - 添加
get_functions_by_priority方法,能精准获取对应优先级的函数,调用自然返回不同数值 - 修正了
unregister_module的逻辑,确保卸载模块的功能正常运行
这样你就能轻松实现两个辅助函数返回不同数值的需求啦!
内容的提问来源于stack exchange,提问作者vishal choudhary
相关产品推荐
相关产品推荐

