2011-09-22 74 views
0

我正在做一些评估已经作为JSON对象保存到文件的日志数据。 为了便于我的工作,我创建了2个小型python脚本,它们根据正则表达式筛选出日志条目,并从事件中打印出多个字段。评估字典变量上的数学表达式

现在我希望能够在打印字段时评估简单的数学运算。这样我可以只是说一些像

./print.py type download/upload 

它会打印类型和上传下载率。我的问题是我不能使用eval(),因为值实际上在dict之内。

有没有简单的解决方案?

+0

你需要一个更具体的equistion你想要一个特定的答案。有很多潜在的方法来解决这个问题。 –

+0

你有没有想要处理的数据的例子? –

回答

2
eval

任选需要globalslocals字典。因此,你可以这样做:

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

记住eval是“邪恶的”,因为它不是安全的,如果执行的字符串是不可信任的。尽管你的帮手脚本应该没问题。

为了完整性,还有ast.literal_eval()这是更安全,但它只评估文字,这意味着没有办法给它一个字典。

1

您可以将dict作为locals传递给eval()。这将允许它解决downloadupload作为名称,如果它们是dict中的键。

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