2013-02-18 59 views
0

我有下面的代碼讀取配置文件,然後把結果保存在某些變量列表如何訪問函數內部聲明的變量在python

import ConfigParser 

def read_config_file(): 
    config = ConfigParser.ConfigParser() 
    cnf_path = 'config_files/php.sr' 
    config.read(cnf_path) 
    if config.has_section('basic'): 
     if config.has_option('basic', 'basic'): 
      php_bsc_mdls = config.get('basic', 'basic').split(',') 
    if config.has_section('advance'): 
     if config.has_option('advance','advance'): 
      php_adv_mdls = config.get('advance', 'advance').split(',') 

現在我想要得到的結果變量php_bsc_mdlsphp_adv_mdls從功能 東西像read_config_file.php_bsc_mdlsread_config_file.php_adv_mdls

所以有可能從python函數訪問/獲取變量?

+0

'回報(php_bsc_mdls,php_adv_mdls)' – 2013-02-18 07:42:36

+0

我得到這個錯誤AttributeError的:「功能」對象有沒有屬性「php_bsc_mdls」當我試圖訪問諸如read_config_file.php_bsc_mdls – 2013-02-18 07:44:56

+0

它依賴,從根本上在Python訪問的方式一個函數的本地環境,但如果你必須這樣做,你沒有做正確的事情!另外,如果兩個條件都沒有被命中,那麼會發生什麼情況,那麼變量不會被創建(python是一種解釋語言),因此您將需要重寫此函數,讓它返回該值,初始化爲None ... – 2013-02-18 07:49:54

回答

1

你只需要返回它們。功能結束後,它們不復存在。

def read_config_file(): 
    config = ConfigParser.ConfigParser() 
    cnf_path = 'config_files/php.sr' 
    config.read(cnf_path) 
    if config.has_section('basic'): 
     if config.has_option('basic', 'basic'): 
      php_bsc_mdls = config.get('basic', 'basic').split(',') 
    if config.has_section('advance'): 
     if config.has_option('advance','advance'): 
      php_adv_mdls = config.get('advance', 'advance').split(',') 

    if php_bsc_mdls and php_adv_bls: 
     return php_bsc_mdls,php_adv_mdls 
    elif php_bsc_mdls: 
     return php_bsc_mdls, None 

其他方法是將類保存到類變量的類。然後從班上獲取這些值,而不是函數。

或者這樣:

def read_config_file(): 
    php_bsc_mdls = None 
    php_adv_mdls = None 
    config = ConfigParser.ConfigParser() 
    cnf_path = 'config_files/php.sr' 
    config.read(cnf_path) 
    if config.has_section('basic'): 
     if config.has_option('basic', 'basic'): 
      php_bsc_mdls = config.get('basic', 'basic').split(',') 
    if config.has_section('advance'): 
     if config.has_option('advance','advance'): 
      php_adv_mdls = config.get('advance', 'advance').split(',') 

    return php_bsc_mdls, php_adv_mdls 

在這兩種情況下,你需要檢查你在哪裏都調用該函數的返回值。如果這些值不是或不是。

+0

ki嘗試過,並得到了錯誤AttributeError:'函數'對象沒有屬性'php_bsc_mdls'當我嘗試read_config_file.php_bsc_mdls – 2013-02-18 07:44:12

+0

你需要檢查它們是否已被創建。將相應地修改代碼。 – Gjordis 2013-02-18 07:44:42

+0

是的,我們可以用類,但試圖使它與python函數 – 2013-02-18 07:47:07

0
def read_config_file(): 
    php_bsc_mdls, php_adv_mdls = None, None # Init to None. 
    ... 
    return php_bsc_mdls, php_adv_mdls # Return at end. 

# Get results 
basic, advanced = read_config_file() 

或者,你可以爲此做一個類。

class Config: 
    php_adv_mdls = None 
    php_bsc_mdls = None 
    @staticmethod 
    def read_config_file(): 
    if not Config.php_adv_mdls and not Config.php_bsc_mdls: 
     # Load the data here. 
     config = ConfigParser.ConfigParser() 
     ... 
     Config.php_adv_mdls = config.get... 
     Config.php_bsc_mdls = config.get... 

使用類變量和靜態方法來加載配置文件一次

Config.php_adv_mdls # None 
Config.read_config_file() # Loads the data from config. 
Config.read_config_file() # Will only attempt another load if either 
          # class variable in not valid. 
Config.php_bsc_mdls  # If successful, will be initialize with data. 
0

正如之前所說,這樣做與回報是合理的。

但是......

在Python函數是對象,所以你可以做水木清華這樣的:

def a(): 
    a.x = 10 

a() 
print a.x # >> 10 

最後雖不好代碼的一個例子,在這種情況下。

相關問題