
解析装饰器传入参数
问题:
如何使用 inspect 获取装饰器中传入的参数?
背景:
立即学习“Python免费学习笔记(深入)”;
代码如下,展示了一个自定义装饰器 task,它接受两个参数 _id 和 params。目标是解析 task 装饰器中传入的参数。
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) # 不生效
解答:
使用 inspect 无法直接获取装饰器中传入的参数。一种变通方法是在装饰器中手动存储变量:
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/1354106.html
微信扫一扫
支付宝扫一扫