2012-07-23 34 views

回答

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將成爲文檔字符串的第一行或之前的行。看起來好像沒有簡單的方法來區分從classdef關鍵字開始的文檔字符串與下一行,特別是當您考慮續行(\)字符時。

+0

謝謝!這似乎是做我想要的。 – Hypercube 2012-07-24 01:21:54

+0

您是否知道是否有一致的方法獲取任何節點的行號?基本上,我想知道是否在文檔字符串的同一行上還有其他內容,因爲這可能發生: 'def test(): '''這是一個文檔字符串''';通過' – Hypercube 2012-07-24 02:26:37

+1

@Hypercube所有節點都有'lineno'屬性,所以在這種情況下,pass語句將和文檔字符串具有相同的'lineno'。 – ecatmur 2012-07-24 09:08:05

相關問題