Вы можете использовать декоратор, который использует ast.NodeVistor
, чтобы пройти через узлы AST функции, чтобы искать декораторы функции.Если список декораторов включает в себя больше, чем сам контролер декоратора, вы можете получить информацию о других декораторах из узлов декоратора:
import inspect
import ast
from textwrap import dedent
class CheckDecorators(ast.NodeVisitor):
def visit_FunctionDef(self, node):
if len(node.decorator_list) > 1:
print("function '%s' is decorated by: %s" % (node.name, ', '.join(ast.dump(decorator) for decorator in node.decorator_list if not isinstance(decorator, ast.Name) or decorator.id != 'check_decorators')))
def check_decorators(func):
CheckDecorators().visit(ast.parse(dedent(inspect.getsource(func))))
return func
, чтобы вывести:
def decorator(func):
def nested(*args, **kwargs):
return func(*args, **kwargs)
return nested
@decorator
@check_decorators
def decorated():
pass
:
function 'decorated' is decorated by: Name(id='decorator', ctx=Load())