Оценка математического выражения по словарным переменным - PullRequest
0 голосов
/ 22 сентября 2011

Я делаю некоторую работу по оценке данных журнала, которые были сохранены как объекты JSON в файл.Для облегчения моей работы я создал 2 небольших скрипта на Python, которые отфильтровывают зарегистрированные записи в соответствии с регулярными выражениями и распечатывают несколько полей из события.

Теперь я хотел бы иметь возможность оценивать простые математические операции при печатиполя.Таким образом, я мог бы просто сказать что-то вроде

    ./print.py type download/upload

, и это напечатало бы тип и соотношение загрузки к загрузке.Моя проблема в том, что я не могу использовать eval(), потому что значения на самом деле находятся внутри dict.

Есть ли простое решение?

Ответы [ 2 ]

2 голосов
/ 22 сентября 2011

eval опционально принимает словари globals и locals. Поэтому вы можете сделать это:

namespace = dict(foo=5, bar=6)
print eval('foo*bar', namespace)

Имейте в виду, что eval является "злом", потому что небезопасно, если исполняемой строке нельзя доверять. Это должно быть хорошо для вашего вспомогательного скрипта.

Для полноты, есть также ast.literal_eval(), который безопаснее, но он оценивает только литералы, что означает, что нет способа дать ему диктовку.

1 голос
/ 22 сентября 2011

Вы можете передать dict на eval() как locals. Это позволит ему разрешать download и upload как имена, если они являются ключами в dict.

>>> d = {'a': 1, 'b': 2}
>>> eval('a+b', globals(), d)
3
...