1

を使用してスタック フレームを取得するとしますsys._getframe(1)。これは明らかに現在のフレームではありません。

ここで、何らかの方法で、外側のスタック フレームに移動し、多分x=10のようなステートメントを実行して、そのフレームに変数を作成したいと考えています。

そのように変数を設定するのは良い習慣ではないことは理解していますが、それは他のステートメントかもしれません。で、肝心なのはそのコマにどう動くかです。with(frame)動作しないようです。

それは可能だと思いますが、そうでなければ、モジュール内にgetinnerframesとという 2 つの関数があるのはなぜですか? 外側のフレームに移動できない場合、なぜ内側のフレームを使用する必要があるのですか?getouterframesinspect

編集:モジュールには、ドキュメントが言ってpdbいる上下に2つのコマンドがあります

d(own) スタック トレース内で現在のフレームを 1 レベル下に (新しいフレームに) 移動します。

u(p) スタック トレースで現在のフレームを 1 レベル上に (古いフレームに) 移動します。

これは私の場合に役立ちますか?はいの場合、どのように使用しますか?

4

1 に答える 1

2

これは一般的に不可能です。フレームがモジュールレベルのコードに対応している場合、次のことができます

exec 'x=10' in frame.f_globals, frame.f_locals

Python 2、または

exec('x=10', frame.f_globals, frame.f_locals)

ただし、フレームが関数呼び出しまたはクラス本体に対応する場合x=10、フレームのスコープ内にネストされたクラス ステートメントに埋め込まれているかのように実行されます。

2 つの個別のオブジェクトがグローバルとローカルとして指定されている場合、コードはクラス定義に埋め込まれているかのように実行されます。

関数のテキストの外側にあるコードは、その関数にローカルな変数を作成できません。

于 2015-06-12T04:29:35.463 に答える