问答

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

作者:admin 2021-06-25 我要评论

@decorator_adef func_a(): pass @decorator_b(arg)@decorator_adef func_b(): pass 如上所示,若我已知: func = func_adeco = decorator_a 请问: 我如何获得f...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)
@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]

谢谢大佬指教!

###

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

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

要检查的代码:

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']}

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • python 如何获取函数上的装饰器元信息

    python 如何获取函数上的装饰器元信息

  • MySQL数据库,磁盘碎片是否会影响查询

    MySQL数据库,磁盘碎片是否会影响查询

  • github有没有反修图项目?有,还请诸君推

    github有没有反修图项目?有,还请诸君推

  • antd pro 如何集成 sentry 并上传日志

    antd pro 如何集成 sentry 并上传日志

腾讯云代理商
海外云服务器