LINUX.ORG.RU

Хочется странного: мат. формулы в конфиге

 


0

1

Доброго времени суток

Есть скрипт мониторинга ( python ), который из множества параметров выбирает те, что указаны в конфиге. Что-то вроде

Eden.Usage.Max = jmx;java.lang:name=PS Eden Space,type=MemoryPool;Usage.max
Eden.Usage.Used = jmx;java.lang:name=PS Eden Space,type=MemoryPool;Usage.used

Хотелось бы в конфиг добавлять переменные, вычисляемые на основе других

Eden.Prct = {Eden.Usage.Used} / {Eden.Usage.Max} * 100

У меня есть рабочий код на perl, но переписывать 10 Кб пока лень :D

Существует ли в python что-то готовое для разбора и вычисления формулы?

★★★★★

Использовать какой-нибудь готовый темплейт движок, типа Jinja2?

BigAlex ★★★
()

готовго не знаю, но можно использовать ленивые вычисления. например обернуть переменую в лямбду lamba x: x.var там где читаются строки конфига а потом использовать передавая инстанс внутрь лямбды.

anonymous
()

Сделай конфиг на самом же питоне, типа config.py

В нем сделай лямбды или функции.

Или задай форуму в виде форматированной строки и eval её.

In [1]: class Eden:
   ...:     Max=1
   ...:     User=2
   ...:     

In [2]: eden=Eden()

In [3]: '{eden.Max}/{eden.User}'.format(eden=eden)
Out[3]: '1/2'

In [4]: eval('{eden.Max}/{eden.User}'.format(eden=eden))
Out[4]: 0.5
pawnhearts ★★★★★
()

Сделай конфиг на самом же питоне, типа config.py

Плюсую этого регистранта. Сам применяю такой подход. И кстати, можно обойтись без eval

Crocodoom ★★★★★
()

Прочитал перловый код. Если выкинуть защиту от дурака, останется не так уж и много

  1. проверка, что в строке с формулой нет ничего, кроме переменных, цифр и ограниченного набора операций
  2. выбор из строки всех переменных
  3. проверка, что все эти переменные уже есть или могут быть получены
  4. проверка на отсутствие рекурсии
  5. подстановка значений переменных через замену по regexp'ам ( тупо по всему списку переменных из п.2
    s/{$vars[i]}/\$value[i]/g
  6. вычисление строки через eval
  7. проверка, не вернул ли eval ошибку

С учётом советов, оберну eval в лямбду, которая на вход получает словарь Data с переменными, а возвращает [error,value]

И замена по регуляркам будет не заменять имя на значение, а менять {name} на Data['name']

router ★★★★★
() автор топика
Последнее исправление: router (всего исправлений: 1)

Всем спасибо!

router ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Идея была в том, что он эту строку из конфига берет, ini, например.

pawnhearts ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.