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

Python 提取所有文档字符串的行号?,python,docstring,Python,Docstring,我试图提取Python模块中所有docstring的开始行号和结束行号。有没有一种不使用正则表达式的合理方法呢?最好的方法是使用模块。特别是,几乎做你想做的事;它返回docstring的内容,而不是节点,但您可以使用相同的算法查找docstring节点及其位置: root = ast.parse(''' def foo(): """the foo function""" pass ''') for node in ast.walk(root): if isinstance

我试图提取Python模块中所有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
属性给出了节点的最后一行,因此父节点的
lineno
将是docstring的第一行或其前面的一行。它看起来不像一个简单的方法来区分与“代码> >类< /代码>或<代码> DEF关键字和同一行开始的DoStine之间的区别,尤其是当您考虑行继承(<代码> \/COD>)字符时,

谢谢!这似乎符合我的要求。您知道是否有一致的方法获取任何节点的行号吗?基本上,我想知道与docstring在同一行上是否还有其他内容,因为这可能会发生:
def test():''这是一个docstring';pass
@supercube所有节点都有一个
lineno
属性,因此在这种情况下,pass语句将具有与docstring相同的
lineno
。“一个函数或类保证至少有一个非docstring节点(如果只是一个pass语句)。”情况并非总是如此,例如:
class Foo:“
将正好有一个节点。使用
node.body[-1].lineno
可能会更好。@astroMonkey说得好,谢谢。比较
node.lineno
node.body[0].value.lineno
似乎是一种方法。