3
我試圖提取Python模塊中所有文檔字符串的開始和結束行號。沒有正則表達式,有沒有一種明智的方法呢?提取所有文檔字符串的行號?
我試圖提取Python模塊中所有文檔字符串的開始和結束行號。沒有正則表達式,有沒有一種明智的方法呢?提取所有文檔字符串的行號?
要做到這一點的最好方法是使用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
將成爲文檔字符串的第一行或之前的行。看起來好像沒有簡單的方法來區分從class
或def
關鍵字開始的文檔字符串與下一行,特別是當您考慮續行(\
)字符時。
謝謝!這似乎是做我想要的。 – Hypercube 2012-07-24 01:21:54
您是否知道是否有一致的方法獲取任何節點的行號?基本上,我想知道是否在文檔字符串的同一行上還有其他內容,因爲這可能發生: 'def test(): '''這是一個文檔字符串''';通過' – Hypercube 2012-07-24 02:26:37
@Hypercube所有節點都有'lineno'屬性,所以在這種情況下,pass語句將和文檔字符串具有相同的'lineno'。 – ecatmur 2012-07-24 09:08:05