我正在尝试提取Python模块中所有文档字符串的开头和结尾行号。如果没有正则表达式,有没有明智的方法呢?
答案 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
将是文档字符串的第一行或行在它之前。看起来并不是一种简单的方法来区分与class
或def
关键字在同一行开始的文档字符串以及下一行,特别是当您考虑行继续时({ {1}})字符。