我正在做一些评估已经作为JSON对象保存到文件的日志数据。 为了便于我的工作,我创建了2个小型python脚本,它们根据正则表达式筛选出日志条目,并从事件中打印出多个字段。评估字典变量上的数学表达式
现在我希望能够在打印字段时评估简单的数学运算。这样我可以只是说一些像
./print.py type download/upload
它会打印类型和上传下载率。我的问题是我不能使用eval()
,因为值实际上在dict
之内。
有没有简单的解决方案?
我正在做一些评估已经作为JSON对象保存到文件的日志数据。 为了便于我的工作,我创建了2个小型python脚本,它们根据正则表达式筛选出日志条目,并从事件中打印出多个字段。评估字典变量上的数学表达式
现在我希望能够在打印字段时评估简单的数学运算。这样我可以只是说一些像
./print.py type download/upload
它会打印类型和上传下载率。我的问题是我不能使用eval()
,因为值实际上在dict
之内。
有没有简单的解决方案?
eval
任选需要globals
和locals
字典。因此,你可以这样做:
namespace = dict(foo=5, bar=6)
print eval('foo*bar', namespace)
记住eval
是“邪恶的”,因为它不是安全的,如果执行的字符串是不可信任的。尽管你的帮手脚本应该没问题。
为了完整性,还有ast.literal_eval()
这是更安全,但它只评估文字,这意味着没有办法给它一个字典。
您可以将dict
作为locals
传递给eval()
。这将允许它解决download
和upload
作为名称,如果它们是dict
中的键。
>>> d = {'a': 1, 'b': 2}
>>> eval('a+b', globals(), d)
3
你需要一个更具体的equistion你想要一个特定的答案。有很多潜在的方法来解决这个问题。 –
你有没有想要处理的数据的例子? –