在字典变量上计算数学表达式
我正在处理一些日志数据,这些数据以JSON对象的形式保存到文件中。为了方便我的工作,我写了两个小的Python脚本,这些脚本可以根据正则表达式过滤出日志条目,并打印出事件的多个字段。
现在我想在打印字段的时候能够进行简单的数学运算。这样我就可以直接说一些类似于
./print.py type download/upload
的内容,它就会打印出类型和上传与下载的比例。我的问题是,我不能使用eval()
,因为这些值实际上是在一个dict
(字典)里面。
有没有简单的解决办法呢?
2 个回答
1
你可以把 dict
传给 eval()
作为 locals
。这样的话,如果 dict
里面有 download
和 upload
这些名字,它就能识别它们。
>>> d = {'a': 1, 'b': 2}
>>> eval('a+b', globals(), d)
3
2
eval
可以选择性地接受两个字典,分别叫做 globals
和 locals
。这意味着你可以这样做:
namespace = dict(foo=5, bar=6)
print eval('foo*bar', namespace)
要记住的是,eval
被认为是“邪恶”的,因为如果执行的字符串不可信,它就不安全。不过,对于你的辅助脚本来说,使用它应该没问题。
为了完整起见,还有一个 ast.literal_eval()
,它更安全,但只会处理字面量,也就是说你不能给它一个字典。