1

という関数をトレースしていますtracedFn():

sys.settrace(traceit)
tracedFn()
sys.settrace(None)

tracedFn:_

def tracedFn():
    foo = False

関数では、traceitexec ステートメントを使用して、次のように tracedFn() 内の変数を使用してステートメントを実行したいと考えています。

def traceit(frame, event, trace_arg):
    if event == 'line':
        exec 'foo = True'
        print frame.f_locals
        #foo still False

return traceit

しかし、frame.f_locals を出力すると、exec は foo 変数を変更しませんか?

4

1 に答える 1

0

execステートメントのドキュメントを参照してください。in式の後に追加することで、コンテキストを指定できます。

exec 'foo = True' in frame.f_globals, frame.f_locals

関数に新しいローカルを追加できないことに注意してください。既存のローカル変数 (コンパイル時に関数で宣言されたもの) のみを変更できます。したがって、fooトレースしている関数で が定義されていない限り、その関数のローカル変数に追加することはできません。 foo

グローバル変数はそのように制限されていません。グローバル名前空間に自由に追加できます。, frame.f_localsその場合は、その部分をそのままにしておいてください。

于 2013-01-27T14:27:55.907 に答える