2013-02-18 1 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_mdls и php_adv_mdls от функции что-то вроде read_config_file.php_bsc_mdls или read_config_file.php_adv_mdls

Так можно получить доступ/получить переменные из функции питона?

+0

'возврат (php_bsc_mdls, php_adv_mdls)' –

+0

я получил эту AttributeError ошибки: «функции» объект не имеет атрибута «php_bsc_mdls», когда я пытался получить доступ как read_config_file.php_bsc_mdls –

+0

Это зависит, в основном не существует способ в Python доступ локальная среда функции, но если вам нужно это сделать, вы ничего не делаете правильно! Кроме того, что произойдет, если ни один из них не попал, тогда переменные не будут созданы (python - интерпретируемый язык), так как вам потребуется переписать эту функцию, вернуть значения, инициализированные в None ... –

ответ

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: объект «function» не имеет атрибута «php_bsc_mdls», когда я попробовал read_config_file.php_bsc_mdls –

+0

Вам нужно проверить, были ли они созданы. Будет соответствующим образом изменен код. – Gjordis

+0

да, мы можем сделать это с помощью класса, но пытаемся сделать это с помощью функций python –

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

Как было сказано, было бы разумно сделать это с возвратом.

Но ...

В функции питона являются объектами, так что вы можете сделать что-л так:

def a(): 
    a.x = 10 

a() 
print a.x # >> 10 

Последний, хотя и не пример хорошего кода, в этом случае.

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

  • Нет связанных вопросов^_^