ast モジュールによって計算されている lineno オフセットについて、私が理解していないことがあります。通常、ast オブジェクトの lineno を取得すると、オブジェクトが検出された最初の行が表示されます。
たとえば、次の場合、foo の lin
st='def foo():\n print "hello"'
import ast
print ast.parse(st).body[0].lineno
print ast.parse(st).body[0].body[0].lineno
関数 foo に対して1を返し、hello world の出力に対して2を返します。
ただし、複数行の docstring (ast.Expr) を解析すると、提供される lineno は最後の行になります。
st='def foo():\n """\n Test\n """'
import ast
print ast.parse(st).body[0].lineno
print ast.parse(st).body[0].body[0].lineno
結果は関数の場合は1行目ですが、docstring の場合は4行目になります。docstring が始まるのは 2 行目なので、2行目にあると予想していました。
私が求めているのは、 ast.Expr を含むすべての ast オブジェクトの最初の lineno を常に取得する方法があるかどうかだと思います。