gpt4 book ai didi

python - 使用 module_from_spec 加载的 python 类中缺少源信息

转载 作者:太空宇宙 更新时间:2023-11-04 00:42:40 25 4
gpt4 key购买 nike

我正在尝试使用 Python 的内省(introspection)模块 inspect 来检索事件对象的源代码,这些事件对象已使用 importlib 的 module_from_spec 函数加载到作用域中.util。尝试对 spec_file 本身或 spec 文件中的任何函数使用 inspect.getsource() 成功返回所需的源代码。但是,用于检索规范文件中类类型的源代码的相同方法会抛出 TypeError: None is a built-in class

from importlib.util import spec_from_file_location, module_from_spec
spec_file = spec_from_file_location("file_module", 'test_file.py')
spec_module = module_from_spec(spec_file)
spec_file.loader.exec_module(spec_module)

# spec module
import inspect
assert isinstance(inspect.getsource(spec_module), str)

# function in spec module
func_obj = getattr(spec_module, 'test_function')
assert isinstance(inspect.getsource(func_obj), str)

# class in spec module
class_obj = getattr(spec_module, 'testClass')
try:
inspect.getsource(class_obj)
except TypeError:
print('where did the source code data go?')

罪魁祸首似乎是回溯链中的 inspect.getfile() 调用,其中函数对象返回 object.__code__ 而类对象试图按顺序加载它们的模块检索模块。__file__。为什么函数有 __code__ 方法,而类没有?这是 Python 如何处理无意中破坏动态加载类的自省(introspection)的类型的副作用吗?

最佳答案

看起来必须将加载的模块添加到 sys.modules 中,以便在类中正确反射(reflect)源和模块路径(尽管我无法在文档中找到对此的引用).因此,如果您导入 sys 并将您的模块添加到 sys.modules,您的示例应该可以工作(我用 Python 3.5 测试了一个类似的示例):

import sys

from importlib.util import spec_from_file_location, module_from_spec
spec_file = spec_from_file_location("file_module", 'test_file.py')
spec_module = module_from_spec(spec_file)
spec_file.loader.exec_module(spec_module)

sys.modules['file_module'] = spec_module

# spec module
import inspect
assert isinstance(inspect.getsource(spec_module), str)

# function in spec module
func_obj = getattr(spec_module, 'test_function')
assert isinstance(inspect.getsource(func_obj), str)

# class in spec module
class_obj = getattr(spec_module, 'testClass')
try:
inspect.getsource(class_obj) # This should work now
except TypeError:
print('where did the source code data go?')

关于python - 使用 module_from_spec 加载的 python 类中缺少源信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41215729/

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