从堆栈框架中检索模块对象
给定一个框架对象,我需要获取相应的模块对象。换句话说,实现callers_module,这样可以正常工作:
import sys
from some_other_module import callers_module
assert sys.modules[__name__] is callers_module()
(这是等效的,因为我可以在此测试用例的函数中生成堆栈跟踪。导入只是为了使该示例完整且可测试,并防止callers_module使用__name__的快捷方式,因为它位于另一个模块中)
我已经尝试过了:
import inspect
def callers_module():
return inspect.currentframe().f_back
哪个得到一个框架对象,在哪个f_code上给我一个代码对象,但是我不知道如何获得相应的模块或其名称(与sys.modules一起使用)。如果我可以获得函数对象,则这些对象具有__module__属性(也具有代码对象),但是框架中不存在。实际上,并非所有代码对象都属于功能对象,例如我的测试用例的代码(上面有assert)。对于没有模块的框架/代码对象也可以这么说,但是其中很多都有,在我看来,它们将是这样,因此不需要处理。但是,在这种情况下,简单的无或例外也可以。
感觉好像我缺少一些简单的东西。要执行此操作需要做什么?