2014-11-18 2 views
1

У меня есть вопрос, связанный с областью видимости в python. Ниже приведен фрагмент кода:Область/пространство имен Python для всех модулей

файл: settings.py

#module settings 
fruit = 'banana' 

def set_fruit(val): 
    global fruit 
    print 'Setting fruit ', fruit, ' to ', val 
    fruit = val 

файл: helper.py

#module helper 
from settings import fruit 

class Helper(object): 
    def __init__(self): 
     print 'Inside Helper fruit = ', fruit 

файл: controller.py

#module controller 
import settings 
import helper 

class Controller(object): 
    def __init__(self): 
     settings.set_fruit('apple') 
     print 'Controller: settings.fruit = ', settings.fruit 

Controller() 
print 'fruit = ', settings.fruit 
helper.Helper() 

settings.py имеет глобальные настройки которые используются различными модулями. Некоторые из этих параметров необходимо изменить во время запуска контроллером. Я хочу знать, почему настройки, измененные контроллером, не видны другим, в этом случае - вспомогательному модулю.

Вот вывод, что я получаю:

$ python controller.py 
Setting fruit banana to apple 
Controller: settings.fruit = apple 
fruit = apple 
Inside Helper fruit = banana 

ответ

1

В тот момент вы from settings import fruit вы создали новый fruit имя в helper модуль, который отдельный от имени settings.fruit. Он просто ссылается на один и тот же объект.

Ваш метод settings.set_fruit() затем перетаскивает settings.fruit, чтобы указать его на новый объект, но ссылка helper.fruit не может следовать примеру; в конце концов, это раздельно.

Все это ничем не отличается от создания двух отдельных локальных переменных, которые ссылаются на значение:

fruit = 'banana' 
another_fruit = fruit 
fruit = 'apple' 
print another_fruit 

Обработку вокруг, чтобы делать то, что вы делали в controller модуле; только имена ссылок в пределах settings как атрибуты модуля. Таким образом, вы всегда будете использовать только одну ссылку, это ссылка на модуль settings, который затем будет доступен другим вашим модулям.

+0

Спасибо за быстрый ответ. Что объясняет его. – TRam

Смежные вопросы