«Локальный» словарь - это то, где все имена задаются во время 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!