提取所有文档字符串的行号?

时间:2012-07-23 08:18:26

标签: python docstring

我正在尝试提取Python模块中所有文档字符串的开头和结尾行号。如果没有正则表达式,有没有明智的方法呢?

1 个答案:

答案 0 :(得分:4)

执行此操作的最佳方法是使用ast模块。特别是,ast.get_docstring几乎可以满足您的需求;它返回docstring而不是节点的内容,但您可以使用相同的算法来查找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属性给出了节点的 last 行,因此父节点的lineno将是文档字符串的第一行或行在它之前。看起来并不是一种简单的方法来区分与classdef关键字在同一行开始的文档字符串以及下一行,特别是当您考虑行继续时({ {1}})字符。