python如何通过inspect获取装饰器传入的参数?

作者站长头像
站长
· 阅读数 18

代码如下,想解析装饰器的参数

import inspect
from functools import wraps

def 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))信息
回复
1个回答
avatar
test
2024-07-18

inspect应该做不到了。目前一种方案就是AI给你说的那种,你需要在decorator中去自己存储你的变量。还有一种方案是去针对性的解析你这个代码,但是不是通用性的。

import ast

def 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)}
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容