检测模块中的修饰函数
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。)
我有一个 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。)