检测模块中的修饰函数

detecting decorated function in module

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

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

我当然可以从源代码创建 AST,然后查看那里,但说实话这很痛苦。 有没有一种方法可以加载模块并检查功能以确定它是否被装饰?我还需要当时获取装饰器的参数和签名装饰函数。

用例是我想在模块中定义一个入口函数,并提供更多关于该方法的信息(无法通过简单的键入捕获)并以某种方式呈现 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 的实施留到 reader。)