eval的python字符串转换

时间:2010-08-19 05:52:09

标签: python regex string eval expression

我的列表如下:

['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 个答案:

答案 0 :(得分:2)

当然,您必须使用eval very careful 。知道为什么你需要在所有

上使用eval会很有趣

如果恶意用户找到将非数字数据放入字段的方法,这种方式会使更难发生的事情

import re
exp = 'qty * price - discount + 100'
exp = re.sub('(qty|price|discount)','%(\\1)f', exp)%vars(obj)

答案 1 :(得分:1)

我假设您拥有的列表是可用的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)

答案 2 :(得分:1)

最简单的方法是循环遍历每个潜在变量,并替换目标字符串中的所有实例。

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'