微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。