0


0

Python Eval実行環境

evalまたはexecステートメントが実行される環境がわかりません。 グローバルスコープとローカルスコープの両方を渡すことができますが、これが何を意味するのかよくわかりません。 Pythonはそれらのために匿名モジュールを作成しますか?その場合、グローバルスコープとローカルスコープはどのように異なりますか?

匿名関数のように実行されますか? その場合、グローバルスコープとローカルスコープは私にとってより意味がありますが、Pythonが割り当て時にローカル変数を作成するのを防ぐために「グローバル変数」を呼び出す必要がありますか?

そして、私が実際にやろうとしていることを示すためのコードがあります。

# module level vars
result = ''

allowed_builtins = {"__builtins__":{'int':int, 'str':str, 'range':range, 'dir':dir,
                                    'zip':zip
},
                    "result":result}

クラスで

def _exec(self, answer, function_name, input):
    global result
    exec_string = answer + '\n'
    exec_string += 'global result; result = %s(%s)' % (function_name, input)
    exec exec_string in allowed_builtins, {}

    return result

私のスコープのvar結果をeval / execのスコープ内から設定できるようにしたいと思います。

1 Answer


2


「ローカル」辞書は、 exec`または eval`中にすべての名前が設定される場所です。 「グローバル」は「ローカル」にない名前の検索に使用されますが、「グローバル」ステートメントを含むコードを「実行」しない限り、名前はそこに設定されません。

モジュールオブジェクトは、本質的に eval`または exec`のいずれかによって作成されることはなく、関数オブジェクト(匿名またはそれ以外)も作成されません(もちろん、 def`などの exec`ステートメントがない限り)。

編集:たとえば、OPのコードが与えられ、OPが存在できる場所に class`を与えないため、 _exec`が独立した関数であると仮定して、最後に追加します:

print 'one: %r' % _exec(None, '"foo"', 'range', 7)
print 'two: %r' % allowed_builtins['result']

次の出力が表示されます。

one: ''
two: [0, 1, 2, 3, 4, 5, 6]

現在のモジュールの dict`の result`はもちろん影響を受けません(そのdictが問題の exec`に渡されることはないので、どうして* be *になるのでしょうか?!)- allowed_builtins`辞書もちろん、それは「グローバル辞書」として渡された辞書であり、「実行」されている文字列に「グローバル」ステートメントがあるからです。