从module_from_spec

时间:2016-12-19 04:24:00

标签: python introspection inspect python-importlib

我正在尝试使用Python的内省模块inspect来检索已使用module_from_spec函数importlib.util加载到范围中的活动对象的源代码。尝试在spec_file本身或spec文件中的任何函数上使用inspect.getsource()成功返回所需的源代码。但是,用于检索spec文件中类类型的源代码的方法会引发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()调用,其中函数对象返回对象。__code__,而类对象尝试加载其模块以检索模块。__file__ 。为什么函数有__code__方法,而类没有?这是否是Python如何处理无意中破坏动态加载类的内省的类型的副作用?

1 个答案:

答案 0 :(得分:1)

看起来加载的模块必须添加到iss>>才能使源和模块路径正确地反映在类中(尽管我在文档中找不到对此的引用)。因此,如果您导入sys.modules并将模块添加到sys,那么您的示例应该可行(我使用Python 3.5测试了类似示例):

sys.modules