3

Python には Tcl のアップレベル コマンドに相当するものがありますか? ご存じない方のために説明すると、「uplevel」コマンドを使用すると、呼び出し元のコンテキストでコードを実行できます。Python では次のようになります。

def foo():
    answer = 0
    print "answer is", answer # should print 0
    bar()
    print "answer is", answer # should print 42


def bar():
    uplevel("answer = 42")

ただし、変数を設定するだけではないため、辞書を変更するだけのソリューションを探しているわけではありません。どんなコードでも実行できるようにしたい。

4

2 に答える 2

3

一般的に、あなたが求めることは不可能です(あなたが間違いなく期待する結果で)。たとえば、「任意のコード」がであると想像してくださいx = 23xこのコードを「呼び出し元で」実行するための魔法のような方法を見つけたと仮定すると、これにより、呼び出し元のローカル変数のセットに新しい変数が追加されますか?いいえ、そうではありません-Pythonコンパイラによって実行される重要な最適化は、def実行時にローカル変数の正確なセット(関数の本体で割り当てられる、またはバインドされるすべてのベアネーム)を一度に定義することです。そして、それらのベアネームへのすべてのアクセスと設定を、スタックフレームへの非常に高速なインデックス作成に変えます。(たとえばexec ''考えられるすべての発信者の開始時に-結果として、システムのパフォーマンスがフロアを介してクラッシュするのを確認します)。

発信者のローカルベアネームに割り当てることを除いexec thecode in thelocals, theglobalsて、おおよそあなたが望むことをするかもしれません、そしてinspectモジュールはあなたが半合理的な方法で発信者のローカルとグローバルを取得することを可能にします(深い黒魔術まで-それは私を行かせますプロダクションコードで実行されることを示唆している同僚への郵便-それを「半合理的」と呼ぶのにふさわしくない賞賛でこれまでに称賛されることができます;-)。

ただし、「任意のコードを実行できるようにしたい」と指定します。そして、その明確な仕様に対する唯一の解決策(そして、答えが簡単になるので、非常に正確であることに感謝します!)は、次のとおりです。次に、別のプログラミング言語を使用します。

于 2010-09-25T17:03:28.213 に答える
1

サードパーティのライブラリは Python で書かれていますか? はいの場合、独自の実装で実行時に関数「foo」を書き直して再バインドできます。そのようです:

import third_party

original_foo = third_party.foo
def my_foo(*args, **kwds):
    # do your magic...
    original_foo(*args, **kwds)
third_party.foo = my_foo

フレームローカルを書き換えるよりも、モンキーパッチの方がわずかに優れていると思います。;)

于 2010-09-25T17:17:14.007 に答える