3

Python モジュール内のすべての docstring の開始行番号と終了行番号を抽出しようとしています。正規表現なしでこれを行う賢明な方法はありますか?

4

1 に答える 1

4

これを行う最善の方法は、astモジュールを使用することです。特に、ast.get_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 の最初の行またはその前の行になります。classorキーワードと同じ行から始まる docstring と、次の行から始まる docstring の違いを簡単に見分ける方法はないようdefです。特に、行継続 ( \) 文字を考慮する場合はそうです。

于 2012-07-23T08:50:22.413 に答える