3
파이썬 모듈에서 모든 문서 문자열의 시작과 끝 줄 번호를 추출하려고합니다. 정규식없이 이것을 할 현명한 방법이 있습니까?모든 문서 문자열의 줄 번호를 추출 하시겠습니까?
파이썬 모듈에서 모든 문서 문자열의 시작과 끝 줄 번호를 추출하려고합니다. 정규식없이 이것을 할 현명한 방법이 있습니까?모든 문서 문자열의 줄 번호를 추출 하시겠습니까?
가장 좋은 방법은 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
키워드와 같은 줄에서 시작하는 문서화 문자열과 다음 줄의 차이점을 쉽게 알 수있는 방법이없는 것 같습니다.
감사합니다. 이것은 내가 원하는 것을하는 것처럼 보입니다. – Hypercube
노드의 라인 번호를 일관되게 얻는 방법이 있는지 알고 계십니까? 기본적으로, 나는 문법과 같은 줄에 다른 것이 있는지 알고 싶다. 왜냐하면 이런 일이 발생할 수 있기 때문이다 : 'def test() : '이것은'문서화 문자열이다 '' '; pass' – Hypercube
@Hypercube 모든 노드는'lineno' 속성을 가지고 있기 때문에, pass 문은 docstring과 같은'lineno'를 가질 것입니다. – ecatmur