Получение списка из файла конфигурации с ConfigParser - PullRequest
7 голосов
/ 20 июля 2011

У меня есть что-то вроде этого в моем файле конфигурации (опция конфигурации, которая содержит список строк):

[filters]
filtersToCheck = ['foo', '192.168.1.2', 'barbaz']

Есть ли более элегантный (встроенный) способ получить список от filtersToCheckвместо удаления скобок, одинарных кавычек, пробелов и последующего использования split() для этого?Может быть, другой модуль?

(Использование python3.)

Ответы [ 3 ]

13 голосов
/ 20 июля 2011

Вы не можете использовать объект python как список в значении для файла конфигурации.Но вы, конечно, можете иметь их в виде значений, разделенных запятыми, и как только вы их получите, выполните разбиение

[filters]
filtersToCheck = foo,192.168.1.2,barbaz

и выполните

filtersToCheck = value.split(',')

Другой подход - это конечно, выделение класса SafeConfigParser и удаление[и] и составление списка.Вы назвали это уродливым, но это жизнеспособное решение.

Третий способ - использовать модуль Python в качестве файла конфигурации.Проекты делают это.Просто используйте filtersToCheck в качестве переменной, доступной в модуле config.py, и используйте объект list.Это чистое решение.Некоторые люди обеспокоены использованием Python-файла в качестве конфигурационного файла (назвав его угрозой безопасности, что является несколько необоснованным опасением), но есть и эта группа, которая считает, что пользователи должны редактировать конфигурационные файлы, а не Python-файлы, которые служат в качестве конфигурационного файла.

2 голосов
/ 20 июля 2011

Посмотрите на configobj .

1 голос
/ 20 июля 2011
ss = """a_string = 'something'
filtersToCheck = ['foo', '192.168.1.2', 'barbaz']
   a_tuple =      (145,'kolo',45)"""

import re
regx = re.compile('^ *([^= ]+) *= *(.+)',re.MULTILINE)


for mat in regx.finditer(ss):
    x = eval(mat.group(2))
    print 'name :',mat.group(1)
    print 'value:',x
    print 'type :',type(x)
    print

результат

name : a_string
value: something
type : <type 'str'>

name : filtersToCheck
value: ['foo', '192.168.1.2', 'barbaz']
type : <type 'list'>

name : a_tuple
value: (145, 'kolo', 45)
type : <type 'tuple'>

Тогда

li = [ (mat.group(1),eval(mat.group(2))) for mat in regx.finditer(ss)]
print li

результат

[('a_string', 'something'), ('filtersToCheck', ['foo', '192.168.1.2', 'barbaz']), ('a_tuple', (145, 'kolo', 45))]
...