gpt4 book ai didi

python - 内省(introspection)以获取方法上的装饰器名称?

转载 作者:IT老高 更新时间:2023-10-28 22:02:17 28 4
gpt4 key购买 nike

我试图弄清楚如何获取方法上所有装饰器的名称。我已经可以获取方法名称和文档字符串,但不知道如何获取装饰器列表。

最佳答案

我很惊讶这个问题太老了,没有人花时间添加实际的内省(introspection)方式来做到这一点,所以这里是:

您要检查的代码...

def template(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper

baz = template
che = template

class Foo(object):
@baz
@che
def bar(self):
pass

现在您可以使用类似这样的方式检查上述 Foo 类...

import ast
import inspect

def get_decorators(cls):
target = cls
decorators = {}

def visit_FunctionDef(node):
decorators[node.name] = []
for n in node.decorator_list:
name = ''
if isinstance(n, ast.Call):
name = n.func.attr if isinstance(n.func, ast.Attribute) else n.func.id
else:
name = n.attr if isinstance(n, ast.Attribute) else n.id

decorators[node.name].append(name)

node_iter = ast.NodeVisitor()
node_iter.visit_FunctionDef = visit_FunctionDef
node_iter.visit(ast.parse(inspect.getsource(target)))
return decorators

print get_decorators(Foo)

应该打印出这样的东西...

{'bar': ['baz', 'che']}

或者至少当我用 Python 2.7.9 快速测试时它确实如此:)

关于python - 内省(introspection)以获取方法上的装饰器名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3232024/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com