2

「exec」で実行するPythonスクリプトがあります。スクリプトによって関数が呼び出されたときに、その呼び出しの行番号とオフセットを知りたいと思います。

ここに例があります。私のスクリプトが次の場合:

foo1(); foo2(); foo1()
foo3()

そして、すべての関数で (line,offset) を出力するコードがある場合、取得する必要があります

(0,0), (0,8), (0,16), (1,0)

ほとんどの場合、これはスタック フレームを取得することで簡単に実行できます。スタック フレームには行番号と関数名が含まれているからです。唯一の問題は、特定の行に同じ名前の関数が 2 つある場合です。残念ながら、これは私にとって一般的なケースです。何か案は?


元のコードを変更するのが最も簡単な解決策のようです。

次のような問題をどのように解決しますか

if foo1(7) or foo1(6):

また

foo2(foo1(), foo1())

これには、あまり洗練されていないソリューションがいくつかあります。たとえば、前の例を自動的に次のように変更します。

def curpos(pos, func):
  record_curpos(pos)
  return func

curpos(foo2,0)(curpos(foo1,5)(), curpos(foo1,13)())

もっとシンプルなアイデアがあれば教えてください。

4

2 に答える 2

1

Python は、行内の文字オフセットに関する多くの情報を提供しません。

exec を使用して Python を実行している場合は、実行する前にコードを機械的に書き直して、知りたいことを伝えることができます。たとえば、元のコードを次のように変更できます。

foo1(); foo2(); foo1()
foo3()

注釈付きコードに:

curpos(1,0); foo1(); curpos(1,8); foo2(); curpos(1,16); foo1()
curpos(2,0); foo3()

次に、注釈付きのコードを実行します。

curpos(line,char)元のコードのそのポイントの行と文字の情報を記録または印刷する場所。これは、スタック フレームをいじるよりもはるかに簡単です。

于 2010-05-13T22:38:52.803 に答える
0

もちろん、文字列の行を見て、関数名を見つけようとすることもできますが、関数をエイリアスする場合は信頼できません。例:

bar = foo2
foo1(); foo2()

そうでなければ、それは本当に難しくなります。カバレッジモジュールはこれを行い、ネッドはブログ投稿で特定の手法を説明しました。基本的には、バイトコードを書き直して、式を異なる(偽の)行番号に分離する必要があります。

これには、実際にはカバレッジモジュール自体を使用できる場合があります。

于 2010-05-13T21:17:07.307 に答える