从堆栈fram检索模块对象

2024-05-08 03:00:46 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个frame对象,我需要得到相应的module对象。换言之,实现调用者模块以使其正常工作:

import sys
from some_other_module import callers_module
assert sys.modules[__name__] is callers_module()

(这是等价的,因为我可以在函数中为这个测试用例生成一个堆栈跟踪。导入只是为了使该示例完整且可测试,并防止调用者模块使用快捷方式使用u name_uu,因为它位于不同的模块中。)

我尝试过:

^{pr2}$

它得到了一个frame对象,在这个对象上f廑code将给我一个code对象,但是我无法找到如何获得相应的模块或它的名称(用于系统模块). 如果我可以得到函数对象,这些对象有一个优module_uu属性(也有代码对象),但是框架中没有这个。实际上,并不是所有的代码对象都属于函数对象,比如我的测试用例的代码(上面的assert)。对于没有模块的frame/code对象也可以这样说,但是很多对象都有,而且在我的例子中,它们会这样做,所以不需要处理;但是,在这种情况下,简单的None或exception也可以。在

感觉我好像错过了一些简单的东西。需要做些什么才能起作用?在


Tags: 模块对象函数代码nameimportsys测试用例
2条回答

同时inspect.getmodule工作很好,我确实找错了地方,我找到了一个稍微好一点的解决方案:

def callers_module():
  module_name = inspect.currentframe().f_back.f_globals["__name__"]
  return sys.modules[module_name]

它仍然在使用检查电流帧(与完全相同的sys.\u getframe相比,我更喜欢它),但它不调用inspect的模块文件名映射(在inspect.getmodule). 在

此外,这个问题启发了一个有趣的方法manage __all__

^{pr2}$
import inspect
def callers_module():
   module = inspect.getmodule(inspect.currentframe().f_back)
   return module

相关问题 更多 >