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")

核心原理:

  1. 使用ast.parse()将源代码解析为抽象语法树
  2. ast.get_docstring()可以获取节点对应的文档字符串
  3. 通过节点的lineno属性获取起始行号
  4. 计算文档字符串的行数确定结束位置

注意点:

  • AST的行号从1开始计数
  • clean=False参数保留原始格式(包括引号和缩进)
  • 这种方法能准确识别三重引号定义的文档字符串位置

一句话总结:用ast模块解析语法树,结合节点行号定位文档字符串位置。


回到顶部