Python字符串转换为EVAL
我有列表这样的:Python字符串转换为EVAL
['name','country_id', 'price','rate','discount', 'qty']
和字符串表达式像
exp = 'qty * price - discount + 100'
我想这个表达式转换成
exp = 'obj.qty * obj.price - obj.discount + 100'
我想EVAL此表达式如eval(exp or False, dict(obj=my_obj))
我的问题是什么将产生蟒蛇EVAL评估表达的最好方式....
当然,你必须使用eval是very careful。很想知道你为什么需要在所有
这样就更难了坏事,如果恶意用户找到一种方法,把非数字数据的字段发生使用eval这个
import re
exp = 'qty * price - discount + 100'
exp = re.sub('(qty|price|discount)','%(\\1)f', exp)%vars(obj)
我也可以使用字面eval,但表达式由最终用户动态输入! – shahjapan 2010-08-19 06:18:12
@shahjapan:使用'literal_eval' - 这就是它的存在! – katrielalex 2010-08-19 08:13:06
我假设你有的列表是可用的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)
最简单的方法是遍历每个潜在变量,并取代它们的所有实例目标字符串。
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'
当我有像list_price,price,standard_price ..... :)的键时,它失败了 – shahjapan 2010-08-19 13:12:09
哪里EXP从何而来? – 2010-08-19 05:58:15
用户输入,以动态方式使用,用户需要更改其表达式 – shahjapan 2010-08-19 06:38:29