Python: странное поведение в отношении выражения exec - PullRequest
3 голосов
/ 16 ноября 2011

Исполнительный оператор:

exec code [ in globals[, locals]]

Когда я выполняю следующий код на python, результат меня действительно смущает. Некоторые переменные были настроены на глобальные переменные, некоторые - на локальные.

s = """
# test var define
int_v1 = 1
list_v1 = [1, 2, 3]
dict_v1 = {1: 'hello', 2:'world', 3:'!'}

# test built-in function
list_v2 = [float(x) for x in list_v1]
len_list_v1 = len(list_v1)

# test function define
def func():
    global g_var, list_v1, dict_v1
    print 'access var in globals:'
    print g_var

    print 'access var in locals:'
    for x in list_v1:
        print dict_v1[x]

"""

g = {'__builtins__': __builtins__, 'g_var': 'global'}
l = {}
exec s in g, l
print 'globals:', g
print 'locals:', l
exec 'func()' in g, l

результат в python2.6.5:

globals: {'__builtins__': <module '__builtin__' (built-in)>, 'dict_v1': {1: 'hello', 2: 'world', 3: '!'}, 'g_var': 'global', 'list_v1': [1, 2, 3]}
locals: {'int_v1': 1, 'func': <function func at 0x00ACA270>, 'x': 3, 'len_list_v1': 3, 'list_v2': [1.0, 2.0, 3.0]}
access var in globals:
global
access var in locals:
hello
world
!

И если я захочу установить все переменные и функции в локальных системах и сохранить права доступа к глобальным переменным. Как это сделать?

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Я просто оставлю это здесь:

>>> code = "a_bad_idea.func_globals['__builtins__'].open.__doc__"
>>> print eval(code, {}, {'a_bad_idea': lambda: None})
open(name[, mode[, buffering]]) -> file object

Open a file using the file() type, returns a file object.  This is the
preferred way to open a file.  See file.__doc__ for further information.
0 голосов
/ 21 ноября 2011

Я думаю, что скрипт должен выполняться как закрытие, но это не так.

Кажется, он ведет новый контекст, пока выполняется скрипт.

В соответствии с правилом LEGB область охвата была ничем, так что функция в сценарии никогда не могла получить доступ к локальным переменным в выражении exec.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...