marshal.py

来自「mallet是自然语言处理、机器学习领域的一个开源项目。」· Python 代码 · 共 316 行

PY
316
字号
"""Marshal module written in Python.This doesn't marshal code objects, but supports everything else.Performance or careful error checking is not an issue."""import StringIOimport stringfrom types import *try:    import newexcept ImportError:    new = NoneTYPE_NULL     = '0'TYPE_NONE     = 'N'TYPE_ELLIPSIS = '.'TYPE_INT      = 'i'TYPE_INT64    = 'I'TYPE_FLOAT    = 'f'TYPE_COMPLEX  = 'x'TYPE_LONG     = 'l'TYPE_STRING   = 's'TYPE_TUPLE    = '('TYPE_LIST     = '['TYPE_DICT     = '{'TYPE_CODE     = 'c'TYPE_UNKNOWN  = '?'class Marshaller:    dispatch = {}    def __init__(self, f):	self.f = f    def dump(self, x):	self.dispatch[type(x)](self, x)    def w_long64(self, x):	self.w_long(x)	self.w_long(x>>32)    def w_long(self, x):	write = self.f.write	write(chr((x)     & 0xff))	write(chr((x>> 8) & 0xff))	write(chr((x>>16) & 0xff))	write(chr((x>>24) & 0xff))    def w_short(self, x):	write = self.f.write	write(chr((x)     & 0xff))	write(chr((x>> 8) & 0xff))    def dump_none(self, x):	self.f.write(TYPE_NONE)    dispatch[NoneType] = dump_none    def dump_ellipsis(self, x):	self.f.write(TYPE_ELLIPSIS)    try:	dispatch[EllipsisType] = dump_ellipsis    except NameError:	pass    def dump_int(self, x):	y = x>>31	if y and y != -1:	    self.f.write(TYPE_INT64)	    self.w_long64(x)	else:	    self.f.write(TYPE_INT)	    self.w_long(x)    dispatch[IntType] = dump_int    def dump_long(self, x):	self.f.write(TYPE_LONG)	sign = 1	if x < 0:	    sign = -1	    x = -x	digits = []	while x:	    digits.append(x & 0x7FFF)	    x = x>>15	self.w_long(len(digits) * sign)	for d in digits:	    self.w_short(d)    dispatch[LongType] = dump_long    def dump_float(self, x):	write = self.f.write	write(TYPE_FLOAT)	s = `x`	write(chr(len(s)))	write(s)    dispatch[FloatType] = dump_float    def dump_complex(self, x):	write = self.f.write	write(TYPE_COMPLEX)	s = `x.real`	write(chr(len(s)))	write(s)	s = `x.imag`	write(chr(len(s)))	write(s)    try:	dispatch[ComplexType] = dump_complex    except NameError:	pass    def dump_string(self, x):	self.f.write(TYPE_STRING)	self.w_long(len(x))	self.f.write(x)    dispatch[StringType] = dump_string    def dump_tuple(self, x):	self.f.write(TYPE_TUPLE)	self.w_long(len(x))	for item in x:	    self.dump(item)    dispatch[TupleType] = dump_tuple    def dump_list(self, x):	self.f.write(TYPE_LIST)	self.w_long(len(x))	for item in x:	    self.dump(item)    dispatch[ListType] = dump_list    def dump_dict(self, x):	self.f.write(TYPE_DICT)	for key, value in x.items():	    self.dump(key)	    self.dump(value)	self.f.write(TYPE_NULL)    dispatch[DictionaryType] = dump_dict    def dump_code(self, x):	self.f.write(TYPE_CODE)	self.w_short(x.co_argcount)	self.w_short(x.co_nlocals)	self.w_short(x.co_stacksize)	self.w_short(x.co_flags)	self.dump(x.co_code)	self.dump(x.co_consts)	self.dump(x.co_names)	self.dump(x.co_varnames)	self.dump(x.co_filename)	self.dump(x.co_name)	self.w_short(x.co_firstlineno)	self.dump(x.co_lnotab)    try:	dispatch[CodeType] = dump_code    except NameError:	passclass NULL:    passclass Unmarshaller:    dispatch = {}    def __init__(self, f):	self.f = f    def load(self):	c = self.f.read(1)	if not c:	    raise EOFError	return self.dispatch[c](self)    def r_short(self):	read = self.f.read	lo = ord(read(1))	hi = ord(read(1))	x = lo | (hi<<8)	if x & 0x8000:	    x = x - 0x10000	return x    def r_long(self):	read = self.f.read	a = ord(read(1))	b = ord(read(1))	c = ord(read(1))	d = ord(read(1))	x = a | (b<<8) | (c<<16) | (d<<24)	if x & 0x80000000 and x > 0:	    x = string.atoi(x - 0x100000000L)	return x    def r_long64(self):	a = self.r_long()	b = self.r_long()	return a | (b<<32)    def load_null(self):	return NULL    dispatch[TYPE_NULL] = load_null    def load_none(self):	return None    dispatch[TYPE_NONE] = load_none    def load_ellipsis(self):	return EllipsisType    dispatch[TYPE_ELLIPSIS] = load_ellipsis    def load_int(self):	return self.r_long()    dispatch[TYPE_INT] = load_int    def load_int64(self):	return self.r_long64()    dispatch[TYPE_INT64] = load_int64    def load_long(self):	size = self.r_long()	sign = 1	if size < 0:	    sign = -1	    size = -size	x = 0L	for i in range(size):	    d = self.r_short()	    x = x | (d<<(i*15L))	return x * sign    dispatch[TYPE_LONG] = load_long    def load_float(self):	n = ord(self.f.read(1))	s = self.f.read(n)	return string.atof(s)    dispatch[TYPE_FLOAT] = load_float    def load_complex(self):	n = ord(self.f.read(1))	s = self.f.read(n)	real = float(s)	n = ord(self.f.read(1))	s = self.f.read(n)	imag = float(s)	return complex(real, imag)    dispatch[TYPE_COMPLEX] = load_complex    def load_string(self):	n = self.r_long()	return self.f.read(n)    dispatch[TYPE_STRING] = load_string    def load_tuple(self):	return tuple(self.load_list())    dispatch[TYPE_TUPLE] = load_tuple    def load_list(self):	n = self.r_long()	list = []	for i in range(n):	    list.append(self.load())	return list    dispatch[TYPE_LIST] = load_list    def load_dict(self):	d = {}	while 1:	    key = self.load()	    if key is NULL:		break	    value = self.load()	    d[key] = value	return d    dispatch[TYPE_DICT] = load_dict    def load_code(self):	argcount = self.r_short()	nlocals = self.r_short()	stacksize = self.r_short()	flags = self.r_short()	code = self.load()	consts = self.load()	names = self.load()	varnames = self.load()	filename = self.load()	name = self.load()	firstlineno = self.r_short()	lnotab = self.load()	if not new:	    raise RuntimeError, "can't unmarshal code objects; no 'new' module"	return new.code(argcount, nlocals, stacksize, flags, code, consts,			names, varnames, filename, name, firstlineno, lnotab)    dispatch[TYPE_CODE] = load_codedef dump(x, f):    Marshaller(f).dump(x)def load(f):    return Unmarshaller(f).load()def dumps(x):    f = StringIO.StringIO()    dump(x, f)    return f.getvalue()def loads(s):    f = StringIO.StringIO(s)    return load(f)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?