在字典变量上计算数学表达式

0 投票
2 回答
1859 浏览
提问于 2025-04-17 02:50

我正在处理一些日志数据,这些数据以JSON对象的形式保存到文件中。为了方便我的工作,我写了两个小的Python脚本,这些脚本可以根据正则表达式过滤出日志条目,并打印出事件的多个字段。

现在我想在打印字段的时候能够进行简单的数学运算。这样我就可以直接说一些类似于

    ./print.py type download/upload

的内容,它就会打印出类型和上传与下载的比例。我的问题是,我不能使用eval(),因为这些值实际上是在一个dict(字典)里面。

有没有简单的解决办法呢?

2 个回答

1

你可以把 dict 传给 eval() 作为 locals。这样的话,如果 dict 里面有 downloadupload 这些名字,它就能识别它们。

>>> d = {'a': 1, 'b': 2}
>>> eval('a+b', globals(), d)
3
2

eval 可以选择性地接受两个字典,分别叫做 globalslocals。这意味着你可以这样做:

namespace = dict(foo=5, bar=6)
print eval('foo*bar', namespace)

要记住的是,eval 被认为是“邪恶”的,因为如果执行的字符串不可信,它就不安全。不过,对于你的辅助脚本来说,使用它应该没问题。

为了完整起见,还有一个 ast.literal_eval(),它更安全,但只会处理字面量,也就是说你不能给它一个字典。

撰写回答