2010-08-19 70 views
0

我有列表这样的: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评估表达的最好方式....

+1

哪里EXP从何而来? – 2010-08-19 05:58:15

+0

用户输入,以动态方式使用,用户需要更改其表达式 – shahjapan 2010-08-19 06:38:29

回答

2

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

这样就更难了坏事,如果恶意用户找到一种方法,把非数字数据的字段发生使用eval这个

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

我也可以使用字面eval,但表达式由最终用户动态输入! – shahjapan 2010-08-19 06:18:12

+0

@shahjapan:使用'literal_eval' - 这就是它的存在! – katrielalex 2010-08-19 08:13:06

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) 
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' 
+0

当我有像list_price,price,standard_price ..... :)的键时,它失败了 – shahjapan 2010-08-19 13:12:09