1

私の仕事は、Python コードのコード フラグメントのインストルメンテーションに関連しています。したがって、私の仕事では、別のpythonファイルを入力として受け取り、スクリプトで必要な場所に必要なコードを挿入するように、pythonでスクリプトを作成します。

次のコードは、インストルメントするファイルのサンプル コードです。

A.py #normal un-instrumented code

statements
....
....

def move(self,a):
    statements
    ......
    print "My function is defined" 
    ......

statements 
......

私のスクリプトが実際に行うことは、A.pyの各行をチェックすることであり、「def」がある場合、コードフラグメントがdef関数のコードの上にインストルメントされます

次の例は、最終的な出力がどのようになるべきかを示しています。

A.py #instrumented code

statements
....
....

@decorator    #<------ inserted code
def move(self,a):
    statements
    ......
    print "My function is defined" 
    ......

statements 
......

しかし、私は異なる出力をもたらしました。次のコードは、私が得ている最終出力です:

A.py #instrumented コード

statements
....
....

@decorator    #<------ inserted code
def move(self,a):
    statements
    ......
    @decorator #<------ inserted code [this should not occur]
    print "My function is defined" 
    ......

statements 
......

インストルメント化されたコードでは、「定義済み」という単語の「def」が認識されるため、その上のコードがインストルメント化されることがわかります。

実際には、インストルメント化されたコードにはこれらの問題がたくさんあり、指定された python ファイルを適切にインストルメント化できませんでした。実際の「def」を文字列と区別する他の方法はありますか?

ありがとうございました

4

2 に答える 2

3

astモジュールを使用して、ファイルを適切に解析します。

defこのコードは、各ステートメントの行番号と列オフセットを出力します。

import ast
with open('mymodule.py') as f:
    tree = ast.parse(f.read())
for node in ast.walk(tree):
    if isinstance(node, ast.FunctionDef):
        print node.lineno, node.col_offset
于 2013-05-29T09:02:38.677 に答える