2013-02-18 102 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 

最后虽不好代码的一个例子,在这种情况下。

相关问题