3

我正在尝试提取 Python 模块中所有文档字符串的开始和结束行号。没有正则表达式有没有一种明智的方法?

4

1 回答 1

4

最好的方法是使用ast模块。特别是,ast.get_docstring几乎可以满足您的需求;它返回文档字符串的内容而不是节点,但您可以使用相同的算法来查找文档字符串节点及其位置:

root = ast.parse('''
def foo():
    """the foo function"""
    pass
''')
for node in ast.walk(root):
    if isinstance(node, (ast.FunctionDef, ast.ClassDef, ast.Module)):
        if (node.body and isinstance(node.body[0], ast.Expr) and
            isinstance(node.body[0].value, ast.Str)):
            print node.lineno, node.body[0].value.lineno, node.body[0].value.s

虽然没有记录,但该lineno属性给出了节点的最后一行,因此lineno父节点的 将是文档字符串的第一行或之前的行。似乎没有一种简单的方法可以区分与classordef关键字在同一行和下一行开始的文档字符串之间的区别,尤其是当您考虑行继续\符 ( ) 时。

于 2012-07-23T08:50:22.413 回答