2010-11-26 4 views
2

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

Это похоже на работу, если я не включает в себя метод __setattr__. Я могу вызвать «settings.top_travel» и получить ответ. Однако, как только я попытаюсь поставить __setattr__, я, кажется, получаю сообщение об ошибке.

Он выглядит довольно рекурсивным, поэтому я предполагаю, что Get вызывает Set и т. Д. В части атрибута set я хочу, чтобы он записывал обратно в файл конфигурации. Поэтому, когда изменяется один из атрибутов настроек, он сохраняется в файле, откуда он появился.

Ниже вы найдете код и текст ошибки.

import ConfigParser 

class settingsFile(object): 

    def __init__(self): 

     """ 
     Reloads the configuration file and returns a dictionary with the 
     settings : 
     [config] 
     top_travel = 250 
     """ 
     # Create a configuration object and read in the file 
     configuration = ConfigParser.ConfigParser() 
     configuration.read('config/config.cfg') 

     # Return all the "config" section as a list and convert to a dictionary 
     self.configuration = dict(configuration.items("config")) 

    def refresh(self): 

     self.__init__() 

    def __getattr__(self, attr): 
     return self.configuration[attr] 

    def __setattr__(self, attr, value): 
     print attr, " is now ", value 
     # Do some clever storing with ConfigParser 

if __name__ == "__main__": 

    settings = settingsFile() 
    print settings.top_travel 
    settings.top_travel = 600 
    print settings.top_travel 

Ошибка:

Traceback (most recent call last): 
    File "/home/stuff/Documents/Software/Python/dBControllers v2/dBControllers.py", line 52, in <module> 
    settings = settingsFile() 
    File "/home/stuff/Documents/Software/Python/dBControllers v2/dBControllers.py", line 37, in __init__ 
    self.configuration = dict(configuration.items("config")) 
    File "/home/stuff/Documents/Software/Python/dBControllers v2/dBControllers.py", line 47, in __setattr__ 
    print self.configuration[attr], " is now ", value 
    File "/home/stuff/Documents/Software/Python/dBControllers v2/dBControllers.py", line 44, in __getattr__ 
    return self.configuration[attr] 
    File "/home/stuff/Documents/Software/Python/dBControllers v2/dBControllers.py", line 44, in __getattr__ 
    return self.configuration[attr] 
...... 
RuntimeError: maximum recursion depth exceeded 
+1

Может быть, вы просто хотите http://www.voidspace.org.uk/python/configobj.html – 2010-11-26 15:58:14

+0

Что конкретная ошибка? Например. ValueError и т. Д. – 2010-11-26 15:58:33

ответ

5

Проблема заключается в том, что установка self.configuration вызывает self.__setattr__

Вы можете обойти, что, изменив назначение на вызов __setattr__ из суперкласса:

class settingsFile(object): 

    def __init__(self): 
     ... 
     # Return all the "config" section as a list and convert to a dictionary 
     object.__setattr__(self, 'configuration', dict(configuration.items("config"))) 
-2

Независимо умный материал вы делаете с ConfigParser в рекурсивном бесконечно. Я не могу быть уверен, потому что я не вижу код, но если вы используете рекурсию, убедитесь, что вы покрываете все ваши базовые случаи.

5

Сделать __setattr__ исключительно атрибутами не начиная с '_' и сохраните конфигурацию в self._configuration, затем добавьте требование, чтобы файлы конфигурации не принимали параметры, имена которых начинаются с символа подчеркивания.

def __setattr__(self, attribute, value): 
    if attribute.startswith('_'): 
      super(settingsFile, self).__setattr__(attribute, value) 
      return 
    # Clever stuff happens here 
Смежные вопросы