2012-07-23 6 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은 docstring의 첫 번째 행이나 그 앞에있는 행이됩니다. 특히 회선 연속 (\) 문자를 고려할 때 class 또는 def 키워드와 같은 줄에서 시작하는 문서화 문자열과 다음 줄의 차이점을 쉽게 알 수있는 방법이없는 것 같습니다.

+0

감사합니다. 이것은 내가 원하는 것을하는 것처럼 보입니다. – Hypercube

+0

노드의 라인 번호를 일관되게 얻는 방법이 있는지 알고 계십니까? 기본적으로, 나는 문법과 같은 줄에 다른 것이 있는지 알고 싶다. 왜냐하면 이런 일이 발생할 수 있기 때문이다 : 'def test() : '이것은'문서화 문자열이다 '' '; pass' – Hypercube

+1

@Hypercube 모든 노드는'lineno' 속성을 가지고 있기 때문에, pass 문은 docstring과 같은'lineno'를 가질 것입니다. – ecatmur