eval(expression[, globals[, locals]])和数据序列化


何其强大的eval?
Eval(expression[, globals[, locals]])
至于eval的功能,不必多讲啊,Python Library有介绍,这里我想讲什么,我想讲一些反序列化和eval的关系!

讲起序列化,我们应该使用过MFC的Archive,C中的FILE,C++和Java中的stream,至于Python,文件有平面文件,xml文件,模块有picker、cPicker、shelve、marshal、或者db相关的模块,如果我们使用平面文件或者xml,则我们从文件中读取字符串,然后从字符串中解析,至于文件中如何安排格式,我们可以设计的明显一点,方便查看,但要一定的解吸过程,如果格式变了,则解吸相关的代码也要变,如果使用模块进行数据的序列化,你可以发现,尽管很方便,但如果你打开文件查看序列化后的数据,只会看见莫名其妙的符号,这些符号呢只有特定的模块才能理解。

Python有一个精妙之处,即它的prin语句,它能将常见的数据(包括list、dict等)以清晰的格式显示出来比如说tuple = (False, 10),则打印(False,10),经过分析我们发现打印的其实是tuple的str表示(或者repr)表示,这真是太好了,tuple本身的赋值形式和它的str表示如此的"一样",str表示其实也就是序列化的一种直观的表达方式。所以,对于python支持的数据类型,我们可以直接将其以str格式保存在平面文件中,反序列化是则完全可以借助eval,eval从文件中读取expression后,直接返回对应的数据类型实例。

序列化:
From __future__ import with_statement
With open(‘tmp.txt’, ‘w’) as file:
print >> file,  (False, 100)

反序列化:
From __future__ import with_statement
With open(‘tmp.txt’, ‘r’):
       Tuple = eval(file.read())

对于少量的数据,使用eval很方便,也具有一定的意图性!同时XML也是很好的选择!