Python中如何准确定位每一条pydoc(主要是类和方法的说明性文本)在源代码字符串中的位置?
使用 epydoc 等库,可以得到相关的 pydoc 说明。
如果我只想得到 a.py 这个源码文件的 pydoc,改怎么办呢?
如果 a.py 源码中有个 d()方法,d()方法也有说明文本,那我怎么得到这个 d()方法的说明文本?并得到该说明文本在 a.py 源码中的位置?
想从 epdoc 库看看它是怎么得到 pydoc 的,但我比较菜,不会调试跟踪。
如果自己使用正则,我想也是可行的。但感觉不容 pydoc 那样准确吧。
所以,还是想知道有没有这样的现成的库或者方法,再或者是思路。
多谢您的回复!
Python中如何准确定位每一条pydoc(主要是类和方法的说明性文本)在源代码字符串中的位置?
2 回复
要准确定位pydoc在源代码字符串中的位置,可以使用ast模块解析代码结构,然后通过inspect模块获取文档字符串的位置信息。下面是一个完整的解决方案:
import ast
import inspect
def find_docstring_positions(source_code):
"""
定位源代码中所有函数、类和模块级文档字符串的位置
返回格式: [(name, start_line, end_line, docstring), ...]
"""
tree = ast.parse(source_code)
positions = []
# 处理模块级文档字符串
if ast.get_docstring(tree):
module_doc = ast.get_docstring(tree, clean=False)
positions.append(('module', 1, len(module_doc.split('\n')), module_doc))
# 遍历AST节点
for node in ast.walk(tree):
if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)):
docstring = ast.get_docstring(node, clean=False)
if docstring:
# 获取节点起始行号(AST行号从1开始)
start_line = node.lineno
# 计算文档字符串结束行
doc_lines = len(docstring.split('\n'))
end_line = start_line + doc_lines - 1
positions.append((node.name, start_line, end_line, docstring))
return positions
# 示例用法
source = '''
"""模块文档字符串示例"""
class MyClass:
"""类文档字符串"""
def method1(self):
"""方法1文档"""
pass
def method2(self):
"""方法2文档
多行示例
"""
pass
def my_function():
"""函数文档字符串"""
return None
'''
positions = find_docstring_positions(source)
for name, start, end, doc in positions:
print(f"{name}: 第{start}行到第{end}行")
print(f"内容: {doc[:50]}...\n")
核心原理:
- 使用
ast.parse()将源代码解析为抽象语法树 ast.get_docstring()可以获取节点对应的文档字符串- 通过节点的
lineno属性获取起始行号 - 计算文档字符串的行数确定结束位置
注意点:
- AST的行号从1开始计数
clean=False参数保留原始格式(包括引号和缩进)- 这种方法能准确识别三重引号定义的文档字符串位置
一句话总结:用ast模块解析语法树,结合节点行号定位文档字符串位置。


