Python 字符串转换用于 eval

0 投票
3 回答
1375 浏览
提问于 2025-04-16 03:00

我有一个这样的列表:

['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中进行计算的最佳方法是什么……

3 个回答

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'
1

我猜你手里的这个列表是可用的对象属性列表。

如果是这样的话,我建议你使用正则表达式,像这样:

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

当然,使用 eval 的时候你必须非常小心。我很好奇你为什么需要用 eval 来做这个。

这样做可以让恶意用户更难在输入框里放入非数字的数据,从而减少出现问题的可能性。

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

撰写回答