2013-12-09 6 views
1

моя ситуация выглядит следующим образом:Python скомпилировал eval?

  1. У меня есть большой стол, как объект, который доступен с ключом строки и целого индекса; то есть поиск выглядит следующим образом: value = table.get("Key", index).
  2. Я хотел бы дать пользователю возможность ввести произвольное алгебраическое выражение, содержащее строковые ключи. Кодовый код затем должен перебирать второй индекс и повторно оценивать выражение.

Таким образом, для ввода данных пользователя, как это: "KeyA + 2*math.abs(KeyC)" Я хотел бы запустить Python код напоминающим:

for index in index_list: 
    answer = table.get("KeyA", index) + 2*math.abs(table.get("Keyc",index)) 

Я предполагаю, что можно разобрать выражение, используя одну из библиотек Python Parser я нашел в Интернете, но мне никоим образом не ясно, как на самом деле «запустить» анализируемый код. Какие-либо предложения?

+0

Я думаю, что с этим что-то не так, вы продолжаете присваивать результаты одной и той же переменной. – smeso

+1

Если вы ввели синтаксический код в действительный код python, вы можете использовать eval() – M4rtini

+0

Ну, я подумал об eval(), но я хотел бы сделать цикл по второму индексу на «снаружи». – user422005

ответ

1

Если конечные пользователи могут вводить переменные в фигурных скобках, {..}, вы можете использовать str.format для форматирования строки

>>> expression = '{a}*{b}' 
>>> values = {'a': 10, 'b': 20, 'c': 30} 
>>> expression.format(**values) 
'10*20' 

Здесь ЗНАЧЕНИЯ словарь может быть заполнен table.get для всех ключей, найденных в выражении, например, с регулярное выражение:

>>> import re 
>>> regexp = re.compile('{(.*?)}') 
>>> keys = regexp.findall(expression) 
>>> keys 
['a', 'b'] 
>>> table_get = lambda *x: np.random.randint(5) 
>>> values = {k: table_get(k) for k in keys} 
>>> expression.format(**values) 
'1*4' 

Тогда вы можете обратиться к Safe way to parse user-supplied mathematical formula in Python для безопасного выражения синтаксического анализа и оценки.

+0

Спасибо - метод expression.format() кажется жизнеспособным. Я буду использовать ссылку «Безопасный синтаксический анализ», которую вы предоставили. – user422005

Смежные вопросы