gpt4 book ai didi

python - 从栈帧中检索模块对象

转载 作者:太空狗 更新时间:2023-10-29 20:59:46 25 4
gpt4 key购买 nike

给定一个框架对象,我需要得到相应的模块对象。换句话说,实现 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__ 属性(也有代码对象),但框架中没有。事实上,并不是所有的代码对象都属于函数对象,比如我的测试用例的代码(上面有断言)。对于没有模块的框架/代码对象也可以这样说——但它们中的许多有,在我的例子中它们会有,所以不需要处理;但是,在这种情况下,简单的 None 或异常也可以。

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

最佳答案

虽然 inspect.getmodule 工作得很好,而且我确实在错误的地方寻找它,但我找到了一个稍微好一点的解决方案:

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

它仍然使用 inspect.currentframe(我更喜欢它而不是完全相同的 sys._getframe),但不调用 inspect 的模块-文件名映射(在 inspect.getmodule 中)。

此外,这个问题启发了一种有趣的方式来 manage __all__ :

from export import export

@export
class Example: pass

@export
def example: pass

answer = 42
export.name("answer")

assert __all__ == ["Example", "example", "answer"]

关于python - 从栈帧中检索模块对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2000861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com