Pythonic чтение из конфигурационных файлов - PullRequest
2 голосов
/ 11 апреля 2010

У меня есть класс Python, который читает файл конфигурации с помощью ConfigParser:

Файл конфигурации:

[geography]
Xmin=6.6
Xmax=18.6
Ymin=36.6
YMax=47.1

Код Python:

class Slicer:
    def __init__(self, config_file_name):
        config = ConfigParser.ConfigParser()
        config.read(config_file_name)
        # Rad the lines from the file
        self.x_min = config.getfloat('geography', 'xmin')
        self.x_max = config.getfloat('geography', 'xmax')
        self.y_min = config.getfloat('geography', 'ymin')
        self.y_max = config.getfloat('geography', 'ymax')

Мне кажется, что последние четыре строки повторяются и должны каким-то образом быть сжаты до одной строки Pythonic, которая создаст переменную self.item для каждого элемента в разделе.

Есть идеи?

Адам

UPDATE:

После ваших ответов я изменил свой код на:

    for item in config.items('geography'):
        setattr(self, '_'+item[0], float(item[1]))

Теперь

   print self.__dict__
   >>> {'_xmax': 18.600000000000001, '_ymax': 47.100000000000001, 
        '_ymin': 36.600000000000001, '_xmin': 6.5999999999999996}

Ответы [ 3 ]

5 голосов
/ 11 апреля 2010

Я обычно стараюсь избегать внешних взаимодействий в конструкторе - затрудняет тестирование кода. Лучше передать экземпляр анализатора конфигурации или fp-подобный объект вместо имени файла.

3 голосов
/ 11 апреля 2010
for line in ['x_min', 'x_max', 'y_min', 'y_max']:

   setattr(self, line, config.getfloat('geography', line.replace('_', '')))
1 голос
/ 11 апреля 2010

Как насчет чего-то вроде:

for key in ['xmin','xmax','ymin','ymax']:
    self.__dict__[key] = config.getfloat('geography',key);

Обратите внимание, что вышеупомянутое назначит его для self.xmin вместо self.x_min ... однако, если вы хорошо с этим именованием, то это должно работать ... в противном случае отображение между именами будет больше кода, чем оригинал.

...