Пожалуйста, поправьте меня экспертами Python, если я ошибаюсь. Я также изучаю Python. Далее я понимаю, почему было выдано исключение NameError
.
В Python вы не можете создать переменную, к которой можно обращаться через модули без указания имени модуля (т. Е. Для доступа к глобальной переменной test
в модуле mod1
вам необходимо использовать mod1.test
, когда вы в модуле mod2
). Область действия глобальной переменной в значительной степени ограничена самим модулем.
Таким образом, когда у вас есть следующее в test.py
:
def my_func():
global test_variable
print repr(test_variable)
Здесь test_variable
относится к test.test_variable
(т.е. test_variable
в пространстве имен модуля test
).
Таким образом, установка test_variable
в script.py
поместит переменную в пространство имен __main__
(__main__
, потому что это модуль / скрипт верхнего уровня, который вы предоставили интерпретатору Python для выполнения). Таким образом, этот test_variable
будет находиться в другом пространстве имен, а не в том пространстве имен модуля test
, где оно должно быть. Следовательно, Python генерирует NameError
, поскольку он не может найти переменную после поиска в глобальном пространстве имен модуля test
и встроенном пространстве имен (пространство имен локальной функции пропускается из-за оператора global
).
Поэтому для работы eval
необходимо установить test_variable
в пространстве имен модуля test
в script.py
:
import test
test.test_variable = 'test_value'
eval('test.my_func()')
Подробнее о области действия и пространствах имен в Python см .: http://docs.python.org/tutorial/classes.html#python-scopes-and-name-spaces