Среда исполнения Python Eval - PullRequest
       11

Среда исполнения Python Eval

0 голосов
/ 28 февраля 2010

Я не понимаю, в какой среде выполняется оператор eval или exec. Вы можете передать им как глобальные, так и локальные области видимости, но я не совсем понимаю, что это значит. Создает ли python для них анонимный модуль, и если это так, то чем отличаются глобальная и локальная область видимости?

Он запускается так, как будто это была анонимная функция? Если бы это было так, глобальные и локальные области были бы более понятными для меня, хотя вам все равно нужно было бы вызывать global var, чтобы запретить 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 Ответ

2 голосов
/ 28 февраля 2010

«Локальный» словарь - это то, где все имена задаются во время exec или eval;«глобальный» используется для поиска имен, не найденных в «локальном», но имена не устанавливаются там, если вы не используете код exec, содержащий оператор global.

Ни один объект модуля не создается по своей природе либо eval или exec, ни какой-либо функциональный объект не является анонимным или иным (опять же, конечно: если вы не exec операторы, такие как def и т. Д.).

Редактировать : например, учитывая код ОП и предполагая, что _exec является автономной функцией, поскольку ОП не дает class, где он может жить, добавьте в конце:

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

и вы увидите этот вывод:

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

result в __dict__ текущего модуля, конечно, не затронут (как это может быть , поскольку этот dict никогда не передается рассматриваемому exec ?!) - словарь затронут, конечно, allowed_builtins, поскольку это dict, передаваемый как "глобальный словарь", и там является оператором global в строке exec uted!

...