python 中 eval 的字符串转换

发布于 2024-09-15 09:28:35 字数 397 浏览 6 评论 0原文

我有一个像这样的列表:

['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 评估表达式的最佳方法......

I have list like:

['name','country_id', 'price','rate','discount', 'qty']

and a string expression like

exp = 'qty * price - discount + 100'

I want to convert this expression into

exp = 'obj.qty * obj.price - obj.discount + 100'

as I wanna eval this expression like eval(exp or False, dict(obj=my_obj))

my question is what would be the best way to generate the expression for python eval evaluation....

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

冷了相思 2024-09-22 09:28:35

当然,您必须非常小心 使用评估。知道为什么您需要为此使用 eval 会很有趣

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

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

Of course you have to be very careful using eval. Would be interesting to know why you need to use eval for this at all

This way makes it harder for something bad to happen if a malicious user finds a way to put non numeric data in the fields

import re
exp = 'qty * price - discount + 100'
exp = re.sub('(qty|price|discount)','%(\\1)f', exp)%vars(obj)
秋千易 2024-09-22 09:28:35

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

I assume that the list you have is the list of available obj properties.

If it is so, I'd suggest to use regular expressions, like this:

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)
你爱我像她 2024-09-22 09:28:35

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

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'

The simplest way would be to loop through each of your potential variables, and replace all instances of them in the target string.

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))

Output:

'your_object.qty * your_object.price - your_object.discount + 100'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文