2013-09-23 133 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是在函數體中指定的任何變量被認爲是一個局部變量,除非它已經明確有兩種globalnonlocal聲明宣佈不同。

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)