我正在尝试使用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如何处理无意中破坏动态加载类的内省的类型的副作用?
答案 0 :(得分:1)
看起来加载的模块必须添加到iss>>
才能使源和模块路径正确地反映在类中(尽管我在文档中找不到对此的引用)。因此,如果您导入sys.modules
并将模块添加到sys
,那么您的示例应该可行(我使用Python 3.5测试了类似示例):
sys.modules