全て、
質問 2617120 に似た質問があります。ここにあります。
質問者は、トレース フックを介して実行されたときに Python の出力関数パラメーターを作成する方法についてのポインターを求めていました。
これに非常によく似たものを探していますが、ひねりがあります。すべてのデータがダンプされる代わりに、実行時にコードを評価し、評価された変数を出力したいと考えています。たとえば、次のコードを使用します。
for modname in modnames:
if not modname or '.' in modname:
continue
...
トレース フックにより、次のように出力されます。
for modname in modnames: | for init in init,., encoding
|
if not modname or '.' in modname: | if not init or '.' in init
continue | continue
if not modname or '.' in modname: | if not . or '.' in .
... |
コード行は、実行中のフレームに基づいて補間されます。特定の状況で命の恩人になる perl でこれを行いました。
Pythonでこれを行うための最良の方法についてアイデアを持っている人はいますか? 私には自分の考えがありますが、人々の意見を聞きたいです (そして、既に作成済みの解決策がある場合)
ここで、btw は参照コードです。
import sys
import linecache
import random
def traceit(frame, event, arg):
if event == "line":
lineno = frame.f_lineno
filename = frame.f_globals["__file__"]
if filename == "<stdin>":
filename = "traceit.py"
if (filename.endswith(".pyc") or
filename.endswith(".pyo")):
filename = filename[:-1]
name = frame.f_globals["__name__"]
line = linecache.getline(filename, lineno)
print "%s:%s:%s: %s" % (name, lineno,frame.f_code.co_name,line.rstrip())
return traceit
def main():
print "In main"
for i in range(5):
print i, random.randrange(0, 10)
print "Done."
sys.settrace(traceit)
main()