#gq: import logging # 获取当前模块的日志记录器,用于输出钩子系统的日志 logger = logging.getLogger(__name__) # 私有全局字典,用于存储所有注册的钩子 # 结构:{ "hook_name": [callback1, callback2, ...] } _hooks = {} def register(hook_name: str, callback: callable): """ 注册一个钩子回调。 如果钩子名不存在,则初始化为空列表,再将回调函数追加进去。 """ if hook_name not in _hooks: _hooks[hook_name] = [] _hooks[hook_name].append(callback) logger.debug(f"Registered hook '{hook_name}' with callback '{callback.__name__}'") def run_action(hook_name: str, *args, **kwargs): """ 执行一个 Action Hook(动作钩子)。 它会按顺序执行所有注册到该钩子上的回调函数,无返回值。 如果某个回调抛出异常,记录错误日志并继续执行下一个回调。 """ if hook_name in _hooks: logger.debug(f"Running action hook '{hook_name}'") for callback in _hooks[hook_name]: try: callback(*args, **kwargs) except Exception as e: logger.error(f"Error running action hook '{hook_name}' callback '{callback.__name__}': {e}", exc_info=True) def apply_filters(hook_name: str, value, *args, **kwargs): """ 执行一个 Filter Hook(过滤钩子)。 它会将 value 依次传递给所有注册的回调函数进行处理,每次处理结果作为下次输入。 如果某个回调抛出异常,记录错误日志并跳过该回调。 最后返回经过所有过滤器处理后的值。 """ if hook_name in _hooks: logger.debug(f"Applying filter hook '{hook_name}'") for callback in _hooks[hook_name]: try: value = callback(value, *args, **kwargs) except Exception as e: logger.error(f"Error applying filter hook '{hook_name}' callback '{callback.__name__}': {e}", exc_info=True) return value