除了最佳做法,是否有令人信服的理由 不 这样做?
我正在编写一个与Google Code项目一起使用的提交后挂钩,该项目通过JSON对象提供提交数据。GC随请求(JSON数据之外)一起提供了HMAC身份验证令牌,因此通过验证该令牌,我对JSON数据既是良性的(因为不信任Google毫无意义)也很有把握。
我自己的(简短的)调查表明,JSON完全是有效的Python,除了"\/"转义序列(GC似乎没有生成)外。
"\/"
因此,当我使用Python 2.4(即没有json模块)时,eval()看起来 确实 很诱人。
json
eval()
编辑: 记录下来,我 不是 问这是个好主意。我 很 清楚它不是,而且我非常怀疑我是否会在以后的任何项目中使用这种技术,即使最终将其用于此项目。我只是想确保自己知道如果遇到这种麻烦。:-)
如果您对脚本可以在一段时间内正常工作感到满意,然后在某些晦涩的边缘情况下随机失败,我将使用eval。
如果您的代码要健壮很重要,那么我会花时间添加simplejson。您不需要C部分来加快速度,因此确实不难将一些.py文件转储到某个目录中。
例如,JSON会使用Unicode,而simplejson返回Unicode,而eval返回str:
>>> simplejson.loads('{"a":1, "b":2}') {u'a': 1, u'b': 2} >>> eval('{"a":1, "b":2}') {'a': 1, 'b': 2}
编辑:eval()表现不同的一个更好的示例:
>>> simplejson.loads('{"X": "\uabcd"}') {u'X': u'\uabcd'} >>> eval('{"X": "\uabcd"}') {'X': '\\uabcd'} >>> simplejson.loads('{"X": "\uabcd"}') == eval('{"X": "\uabcd"}') False
编辑2:今天看到了SilentGhost指出的另一个问题:eval无法正确处理true-> True,false-> False,null-> None。
>>> simplejson.loads('[false, true, null]') [False, True, None] >>> eval('[false, true, null]') Traceback (most recent call last): File "<interactive input>", line 1, in <module> File "<string>", line 1, in <module> NameError: name 'false' is not defined >>>