我试图弄清楚如何获取方法上所有装饰器的名称。我已经可以获得方法名称和文档字符串,但无法弄清楚如何获取装饰器列表。
我很惊讶这个问题这么老了,没有人花时间添加实际的内省方法来做到这一点,所以这里是:
您要检查的代码...
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 快速测试时是这样的:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)