преобразование строки Python для Eval - PullRequest
0 голосов
/ 19 августа 2010

У меня есть список вроде:

['name','country_id', 'price','rate','discount', 'qty']

и строковое выражение типа

exp = 'qty * price - discount + 100'

Я хочу преобразовать это выражение в

exp = 'obj.qty * obj.price - obj.discount + 100'

, как хочуОцените это выражение как eval(exp or False, dict(obj=my_obj))

Мой вопрос: как лучше всего сгенерировать выражение для оценки python eval? ...

Ответы [ 3 ]

2 голосов
/ 19 августа 2010

Конечно, вы должны быть очень осторожны , используя eval. Было бы интересно узнать, для чего вообще нужно использовать eval

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

import re
exp = 'qty * price - discount + 100'
exp = re.sub('(qty|price|discount)','%(\\1)f', exp)%vars(obj)
1 голос
/ 19 августа 2010

Простейшим способом было бы перебрать каждую из ваших потенциальных переменных и заменить все их экземпляры в целевой строке.

keys = ['name','country_id', 'price','rate','discount', 'qty']
exp = 'qty * price - discount + 100'

for key in keys:
    exp = exp.replace(key, '%s.%s' % ('your_object', key))

Выход:

'your_object.qty * your_object.price - your_object.discount + 100'
1 голос
/ 19 августа 2010

Я предполагаю, что у вас есть список доступных свойств obj.

Если это так, я бы предложил использовать регулярные выражения, например:

import re

properties = ['name', 'country_id', 'price', 'rate', 'discount', 'qty']
prefix = 'obj'
exp = 'qty * price - discount + 100'

r = re.compile('(' + '|'.join(properties) + ')')
new_exp = r.sub(prefix + r'.\1', exp)
...