python 如何获取函数上的装饰器元信息?以及知道装饰器,如何获取被装饰过的函数信息?

发布于 2022-09-12 03:38:29 字数 528 浏览 23 评论 0

@decorator_a
def func_a():
    pass
    
@decorator_b(arg)
@decorator_a
def func_b():
    pass

如上所示,若我已知:

func = func_a
deco = decorator_a

请问:

  • 我如何获得func上装饰器的元信息?

如:

meta = get_func_decorator(func)
print(meta.__name__)
------
decorator_a
  • 我如何获得deco装饰过的函数信息?

如:

meta = get_deco_functions(deco)
print([x.__name__ for x in meta])
---------
[func_a, func_b]

谢谢大佬指教!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

陌路终见情 2022-09-19 03:38:29

估计没有一般性的方法,因为有些库可以帮助隐藏已修饰函数的事实。这里有一些非通用的做法,可以参考:

添加实际的内省方法来做到这一点,

要检查的代码:

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']}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文