Как оценить простые математические выражения в конфигурационных файлах - PullRequest
3 голосов
/ 11 января 2011

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

[section]
a = 10
b = 15
c = a-5
d = b+c

Есть ли способ сделать это с помощью модуля ConfigParser? Я нашел несколько примеров использования строк в качестве переменных в файлах конфигурации, но если я их использую, я получаю строки, которые не были оценены (и я должен проанализировать их в своем коде Python).

Если это невозможно в ConfigParser, есть ли какой-нибудь модуль, который вы порекомендуете?

Ответы [ 3 ]

9 голосов
/ 11 января 2011

Зачем использовать ConfigParser? Почему не просто

config.py:

a = 10
b = 15
c = a-5
d = b+c

script.py:

import config
print(config.c)
# 5
print(config.d)
# 20
2 голосов
/ 11 января 2011

Если вам нужно, вы можете сделать что-то вроде этого:

example.conf:

[section]
a = 10
b = 15
c = %(a)s+%(b)s
d = %(b)s+%(c)s

и в вашем скрипте вы можете сделать:

import ConfigParser

config = ConfigParser.SafeConfigParser()
config.readfp(open('example.conf'))

print config.get('section', 'a')
# '10'
print config.get('section', 'b')
# '15'
print config.get('section', 'c')
# '10+15'
print config.get('section', 'd')
# '15+10+15'

и вы можете вычислить выражение:

print eval(config.get('section', 'c'))
# 25
print eval(config.get('section', 'd'))
# 40

Если я могу предложить, я думаю, что в ConfigParser классах модулей отсутствует функция, подобная этой, я думаю, что метод get () должен позволить передать функцию, которая будет проверять выражение :

def my_get(self, section, option, eval_func=None):

    value = self.get(section, option)
    return eval_func(value) if eval_func else value

setattr(ConfigParser.SafeConfigParser, 'my_get', my_get)


print config.my_get('section', 'c', eval)
# 25

# Method like getint() and getfloat() can just be writing like this:

print config.my_get('section', 'a', int)
# 10
2 голосов
/ 11 января 2011

Один из подходов, который используют некоторые проекты, - сделать ваш файл конфигурации модулем Python. Затем просто импортируйте его (или используйте exec) для запуска содержимого. Это дает вам большие возможности, хотя, очевидно, есть некоторые проблемы с безопасностью в зависимости от того, где вы его используете («просто вставьте эти строки в файл .wheverrc.py ...»).

...