我的列表如下:
['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求值生成表达式的最佳方法....
答案 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'