You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者风说起就起

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:52:23