# module level vars result = '' allowed_builtins = {"__builtins__":{'int':int, 'str':str, 'range':range, 'dir':dir, 'zip':zip }, "result":result}
0
0
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`辞書もちろん、それは「グローバル辞書」として渡された辞書であり、「実行」されている文字列に「グローバル」ステートメントがあるからです。