微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检测模块中的装饰函数

如何解决检测模块中的装饰函数

我有一个python模块的源代码,我想在模块中找到一个特定的函数函数,不是类,不是类中的方法等等)。 该函数将使用特定的装饰器进行装饰(该装饰器具有开放的参数列表,因为其参数取决于所装饰的函数)。

请注意,该函数不会运行。

我当然可以从源代码创建 AST,然后在那里查看,但 TBH 非常痛苦。 有没有办法加载模块并检查函数以查找它是否被装饰?我当时还需要获取装饰器的参数和签名被装饰的函数

用例是我想在模块中定义一个入口函数,并且还提供一些关于该方法的更多信息(不能通过简单的输入来捕获)并以某种 UI 呈现给具有功能功能用户关于它的所有信息(来自它的签名 + 装饰器中的数据)。装饰器的作用也是在运行时检查这些位..

回到简单的例子,假设我有一个参数化装饰器:

def main_function(*ef_args,**ef_kwargs):
    def inner_dec(f):
        def wrapped(*args,**kwargs):
            # use ef_args,ef_kwargs
            response = f(args,kwargs)
            return response
        return wrapped
    return inner_decorator

然后是模块文件中的一个函数(假设上面的装饰器是导入的):

@main_function(type2="MyFrame",result1="somethign..",result2="somethingelse")
def my_main(param1: string,param2: Frame):
    ....

当我通过inspect尝试时,我可以看到my_main,但看不到如何判断它是用我的装饰器装饰的,它的签名总是作为装饰器的签名出现。 有任何想法吗? 谢谢。

解决方法

如果你像这样改变你的装饰器:

import functools
def main_function(*ef_args,**ef_kwargs):
    def inner_dec(f):
        # this makes sure that `wrapped` looks like `f`
        # in terms of signature:
        @functools.wraps(f) 
        def wrapped(*args,**kwargs):
            # use ef_args,ef_kwargs
            response = f(args,kwargs)
            return response
        register_my_function(wrapped) # this registers your function
        return wrapped
    return inner_decorator

...这应该在导入时注册所有用 main_function 修饰的函数,并且在调用时表现相同。

register_my_function 的实现留给读者。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。