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 中,如何从导入的模块访问主模块的命名空间?