2013-09-23 2 views
0

Я знаю, что было несколько сообщений об этом, но я все еще смущен. Я пытаюсь использовать статическую переменную с инициализацией и не знаю, как это сделать. Итак, у меня есть пакет 'config', который имеет модуль the_config.py. То, что я хотел бы для этого, чтобы быть чем-то вродеСтатические переменные и методы python

# the_config.py 

import yaml 

user_settings=None 

def initialize(user_settings_file) 

    with open(user_settings_file) as yaml_handle: 
    user_settings = yaml.safe_load(user_settings_file) 

Тогда будет вызывающий модуль, как pipeline.py

#pipeline.py 

import config.the_config as my_config 

def main(argv): 

    ... 
    my_config.intialize(user_settings_file) 
    print my_config.user_settings['Output_Dir'] 

Но это не работает. Как мне это делать, пожалуйста?

Заранее спасибо.

ответ

3

Когда вы назначаете user_settings, он автоматически обрабатывается как локальная переменная в функции initialize. Сказать Python, что назначение призвано изменить глобальную переменную вместо этого, вам нужно написать

global user_settings 

в начале initialize.

0

В Python любой переменной, которая назначается в теле функции считается локальной переменной, если это не было явно объявлен по-другому либо с global или nonlocal деклараций.

Python рассматривает также назначение любого оператора «расширенного назначения», такого как += или /=.

Обязательная декларация global, которые были изменены (это небольшая) цена, чтобы заплатить за то, что в Python нет необходимости объявлять переменные.

Также предполагается, что ваш код не слишком полагается на мутирующее состояние, в котором хранятся глобальные переменные, поэтому, если вашему коду требуется много объявлений global, возможно, что-то не так.

+0

Я просто хочу, чтобы сделать это за несколько вещей - как конфиге и настройки журнала. Поэтому инициализируйте их один раз, а затем используйте их во всех классах – user2689782

0

Я могу предложить вам какой-то способ решить эту проблему.

Прежде всего, корень вашей проблемы является создание новой локальной переменной в функции инициализации

user_settings = yaml.safe_load(user_settings_file) 

Как только есть знак равенства право на имя переменной питона создать новую переменную в соответствующий объем (в этом регистр локальными для initialize функции

, чтобы избежать этого можно использовать следующее:

использования global декларации

изменить существующую переменную, но не создавать новый

user_settings = {} 
def initialize(user_settings_file) 
    with open(user_settings_file) as yaml_handle: 
     user_settings.update(yaml.safe_load(user_settings_file)) # here we modify existing user_settings 

работать с атрибутом модуля (это один довольно сложно)

user_settings = {} 
def initialize(user_settings_file) 
    with open(user_settings_file) as yaml_handle: 
     import the_config 
     the_config.user_settings = yaml.safe_load(user_settings_file) 
Смежные вопросы