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

Posted

技术标签:

【中文标题】Python从导入的模块中获取类的行号【英文标题】:Python get line number of classes from imported module 【发布时间】:2021-08-09 11:22:04 【问题描述】:

我一直在使用 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 行定义的。

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于Python从导入的模块中获取类的行号的主要内容,如果未能解决你的问题,请参考以下文章

python导入类

在 Python 中,如何从导入的模块访问主模块的命名空间?

如何获取由python模块导入的模块列表

python 关于 不同模块内类的变量继承和包的模块导入的一些感悟

Python:仅使用 dir() 获取导入模块中定义的类?

Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)