Flask装饰器记录函数信息后如何批量获取?
Flask装饰器理解与函数信息收集问题解答
一、关于装饰器与注解的理解确认
你的理解完全正确。Python里的装饰器本质是接收函数作为参数、返回新函数的高阶函数,核心作用就是扩展原函数功能——它会“包裹”原函数,在不修改原函数代码的前提下,在函数调用前后插入额外逻辑(比如日志、权限校验、统计等),相当于“劫持”了原函数的调用流程。
而注解(比如Java的Annotation)是元数据,本身不直接影响代码执行,更多是给编译器、框架提供额外信息。Python没有原生的注解语法,我们常说的“Python注解”其实是函数参数/返回值的类型提示,和装饰器逻辑完全不同。你用@decorator(...)的写法,本质是带参数的装饰器,只是写法和Java注解相似,底层逻辑天差地别。
二、如何获取所有装饰器记录的函数信息
当然可以,只要在装饰器里统一存储收集到的信息就行,给你两种实用实现思路:
1. 装饰器内部维护全局存储
定义装饰器时创建一个全局字典,每次装饰函数时,把函数标识(比如__qualname__)和收集到的信息关联存入。示例代码:
# 全局存储所有被装饰函数的信息 function_records = {} def func_info(author, time, effect): def decorator(func): # 用函数的唯一标识作为key,存入信息 function_records[func.__qualname__] = { 'author': author, 'time': time, 'effect': effect, 'func_name': func.__name__ } # 保留原函数调用逻辑 def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper return decorator # 使用示例 @func_info(author='张三', time='2024-05-20', effect='处理用户登录请求') def login(): pass @func_info(author='李四', time='2024-05-21', effect='获取用户信息') def get_user_info(): pass # 查看所有记录 print(function_records)
2. 给被装饰函数绑定自定义属性
不需要全局变量,直接把收集到的信息作为属性绑定到原函数上,之后遍历模块函数提取即可。示例代码:
def func_info(author, time, effect): def decorator(func): # 给原函数添加自定义属性 func._author = author func._time = time func._effect = effect # 包裹原函数,同时复制原函数属性避免丢失 def wrapper(*args, **kwargs): return func(*args, **kwargs) wrapper.__dict__.update(func.__dict__) return wrapper return decorator # 使用示例 @func_info(author='张三', time='2024-05-20', effect='处理用户登录请求') def login(): pass # 提取单个函数信息 print(login._author, login._time, login._effect) # 遍历模块所有函数,收集带标记的信息 import inspect import sys current_module = sys.modules[__name__] all_records = [] for name, obj in inspect.getmembers(current_module, inspect.isfunction): if hasattr(obj, '_author'): all_records.append({ 'func_name': name, 'author': obj._author, 'time': obj._time, 'effect': obj._effect }) print(all_records)
注意:如果是Flask视图函数,@func_info要放在@app.route下方——装饰器是从下往上执行的,这样才能把属性绑定到最终被Flask处理的视图函数上。
内容的提问来源于stack exchange,提问作者风说起就起
相关产品推荐
相关产品推荐

