如何解决检测模块中的装饰函数
我有一个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 举报,一经查实,本站将立刻删除。