Python装饰器参数如何通过inspect模块获取?

python装饰器参数如何通过inspect模块获取?

通过inspect获取装饰器参数的难题

python中,inspect模块提供了获取函数元数据的方法。然而,获取装饰器传入的参数却并非易事。

以以下代码为例:

import inspectfrom functools import wrapsdef task(_id, params):        def decorator(func):        @wraps(func)        def wrapper(*args, **kwargs):            return func(*args, **kwargs)        return wrapper    return decorator@task(_id="aaa", params=(1,2,3))def foo(q=1):    ...if __name__ == '__main__':    print(inspect.getclosurevars(foo.__wrapped__).nonlocals)  # 不生效,期望获取(_id="aaa", params=(1,2,3))信息

使用inspect.getclosurevars获取闭包变量不起作用,因为装饰器内部定义的变量不在foo.__wrapped__的闭包中。

立即学习“Python免费学习笔记(深入)”;

解决方案

inspect无法直接获取装饰器参数,目前有以下变通方案:

1. 在装饰器内部存储参数

在decorator函数中显式存储参数,然后在包装器函数中使用它们。

2. 使用ast解析代码

使用ast模块解析装饰器的代码,并提取参数。不过,这种方法仅适用于特定类型的代码,缺乏通用性。

示例代码:

import astdef get_decorator_args(func):    source = inspect.getsource(func)    tree = ast.parse(source)    for node in ast.walk(tree):        if isinstance(node, ast.FunctionDef):            for decorator in node.decorator_list:                if isinstance(decorator, ast.Call) and decorator.func.id == "task":                    args = {                        arg.arg: ast.literal_eval(arg.value)                        for arg in decorator.keywords                    }                    return args    return {}print(get_decorator_args(foo))  # {'_id': 'aaa', 'params': (1, 2, 3)}

需要注意的是,该解决方案仅适用于上述特定代码片段。对于更复杂的装饰器,可能需要定制化的解析代码。

以上就是Python装饰器参数如何通过inspect模块获取?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1354058.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 18:13:50
下一篇 2025年12月13日 18:13:57

相关推荐

发表回复

登录后才能评论
关注微信