Hello! 欢迎来到小浪资源网!

Python装饰器参数解析:如何用inspect或其他方法获取装饰器传入的参数?


Python装饰器参数解析:如何用inspect或其他方法获取装饰器传入的参数?

解析装饰器传入参数

问题:

如何使用 inspect 获取装饰器中传入的参数?

背景:

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

代码如下,展示了一个自定义装饰器 task,它接受两个参数 _id 和 params。目标是解析 task 装饰器中传入的参数。

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)  # 不生效

解答:

使用 inspect 无法直接获取装饰器中传入的参数。一种变通方法是在装饰器中手动存储变量:

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)}

此方法仅适用于特定的代码,不具有通用性。

相关阅读