Python从导入的模块中获取类的行号

问题描述

我一直在使用 importlib 从导入的 python 文件获取模块,并想获取 python 文件中定义每个类的行号。 例如我有这样的事情:

testSpec = importlib.util.spec_from_file_location("",old_file)
testModule = importlib.util.module_from_spec(testSpec)
testSpec.loader.exec_module(testModule)

其中 old_file 是一个 python 文件(我们称之为 old.py)。然后使用检查库,我可以通过这种方式从 old.py 中找到所有类:

for name,obj in inspect.getmembers(testModule):
    if inspect.isclass(obj):
        print(name)

这给了我所有从 old.py 创建的类名,这是正确的。但是,我还想做的是获取此类出现在 old.py 中的行号。我试图在打印语句之后的 if 语句中添加这一行:print(inspect.getsourcelines(obj))

然而,这会以这种方式出错:

File "old.py",line 665,in getfile
raise TypeError('{!r} is a built-in class'.format(object))
TypeError: <class '.exampleClassName'> is a built-in class

我不知道为什么它认为这个用户创建的类是一个内置类,但是有没有另一种方法可以让我得到在 old.py 中定义这个类的行号?例如,如果 old.py 看起来像这样:

#test comment line 1
#test comment line 2

class exampleClassName:
    test = 0

然后,当我拥有类对象 exampleClassName 时,我希望从 inspect.getsourcelines(obj) 打印出 4,因为它是在第 4 行定义的。

解决方法

一个选项是使用 open.readline() 循环遍历文件,并查看该行与 class 匹配的位置,然后将行(计数)编号和类名保存到dict