我正在做一些工作来评估已作为JSON对象保存到文件的日志数据。 为了方便我的工作,我创建了2个小python脚本,根据正则表达式过滤掉记录的条目,并打印出事件中的多个字段。
现在我希望能够在打印字段时评估简单的数学运算。这样我就可以说像
这样的东西 ./print.py type download/upload
它将打印类型和上传下载比率。我的问题是我无法使用eval()
,因为这些值实际上位于dict
内。
有简单的解决方案吗?
答案 0 :(得分:2)
eval
可选择使用globals
和locals
词典。因此,您可以这样做:
namespace = dict(foo=5, bar=6)
print eval('foo*bar', namespace)
请记住eval
是“邪恶的”,因为如果执行的字符串不可信,则不安全。但是对你的助手脚本应该没问题。
对于completness,还有ast.literal_eval()
更安全,但它只评估文字,这意味着没有办法给它一个字典。
答案 1 :(得分:1)
您可以将dict
传递给eval()
作为locals
。如果它们是download
中的密钥,则可以将upload
和dict
解析为名称。
>>> d = {'a': 1, 'b': 2}
>>> eval('a+b', globals(), d)
3