blob: a3034655486b1595e58b69ffa43ec8e6a857476b [file] [log] [blame]
Guido van Rossum54f22ed2000-02-04 15:10:34 +00001"""Create portable serialized representations of Python objects.
Guido van Rossuma48061a1995-01-10 00:31:14 +00002
Guido van Rossume467be61997-12-05 19:42:42 +00003See module cPickle for a (much) faster implementation.
4See module copy_reg for a mechanism for registering custom picklers.
Guido van Rossuma48061a1995-01-10 00:31:14 +00005
Guido van Rossume467be61997-12-05 19:42:42 +00006Classes:
Guido van Rossuma48061a1995-01-10 00:31:14 +00007
Guido van Rossume467be61997-12-05 19:42:42 +00008 Pickler
9 Unpickler
Guido van Rossuma48061a1995-01-10 00:31:14 +000010
Guido van Rossume467be61997-12-05 19:42:42 +000011Functions:
Guido van Rossuma48061a1995-01-10 00:31:14 +000012
Guido van Rossume467be61997-12-05 19:42:42 +000013 dump(object, file)
14 dumps(object) -> string
15 load(file) -> object
16 loads(string) -> object
Guido van Rossuma48061a1995-01-10 00:31:14 +000017
Guido van Rossume467be61997-12-05 19:42:42 +000018Misc variables:
Guido van Rossuma48061a1995-01-10 00:31:14 +000019
Fred Drakefe82acc1998-02-13 03:24:48 +000020 __version__
Guido van Rossume467be61997-12-05 19:42:42 +000021 format_version
22 compatible_formats
Guido van Rossuma48061a1995-01-10 00:31:14 +000023
Guido van Rossuma48061a1995-01-10 00:31:14 +000024"""
25
Guido van Rossum743d17e1998-09-15 20:25:57 +000026__version__ = "$Revision$" # Code version
Guido van Rossuma48061a1995-01-10 00:31:14 +000027
28from types import *
Guido van Rossum4fb5b281997-09-12 20:07:24 +000029from copy_reg import dispatch_table, safe_constructors
Guido van Rossumd3703791998-10-22 20:15:36 +000030import marshal
31import sys
32import struct
Skip Montanaro23bafc62001-02-18 03:10:09 +000033import re
Guido van Rossuma48061a1995-01-10 00:31:14 +000034
Skip Montanaro352674d2001-02-07 23:14:30 +000035__all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler",
36 "Unpickler", "dump", "dumps", "load", "loads"]
37
Guido van Rossumd3703791998-10-22 20:15:36 +000038format_version = "1.3" # File format version we write
39compatible_formats = ["1.0", "1.1", "1.2"] # Old format versions we can read
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000040
41mdumps = marshal.dumps
42mloads = marshal.loads
Guido van Rossum0c891ce1995-03-14 15:09:05 +000043
Raymond Hettingeraef22fb2002-05-29 16:18:42 +000044class PickleError(Exception):
45 """A common base class for the other pickling exceptions.
46
47 Inherits from \exception{Exception}.
48
49 """
50 pass
51
52class PicklingError(PickleError):
53 """This exception is raised when an unpicklable object is passed to the
54 dump() method.
55
56 """
57 pass
58
59class UnpicklingError(PickleError):
60 """This exception is raised when there is a problem unpickling an object,
61 such as a security violation.
62
63 Note that other exceptions may also be raised during unpickling, including
64 (but not necessarily limited to) AttributeError, EOFError, ImportError,
65 and IndexError.
66
67 """
68 pass
Guido van Rossum7849da81995-03-09 14:08:35 +000069
Guido van Rossumff871742000-12-13 18:11:56 +000070class _Stop(Exception):
71 def __init__(self, value):
72 self.value = value
73
Jeremy Hylton2b9d0291998-05-27 22:38:22 +000074try:
75 from org.python.core import PyStringMap
76except ImportError:
77 PyStringMap = None
78
Guido van Rossumdbb718f2001-09-21 19:22:34 +000079try:
80 UnicodeType
81except NameError:
82 UnicodeType = None
83
84
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000085MARK = '('
86STOP = '.'
87POP = '0'
88POP_MARK = '1'
89DUP = '2'
90FLOAT = 'F'
91INT = 'I'
92BININT = 'J'
93BININT1 = 'K'
94LONG = 'L'
95BININT2 = 'M'
96NONE = 'N'
97PERSID = 'P'
98BINPERSID = 'Q'
99REDUCE = 'R'
100STRING = 'S'
101BINSTRING = 'T'
102SHORT_BINSTRING = 'U'
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000103UNICODE = 'V'
104BINUNICODE = 'X'
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000105APPEND = 'a'
106BUILD = 'b'
107GLOBAL = 'c'
108DICT = 'd'
109EMPTY_DICT = '}'
110APPENDS = 'e'
111GET = 'g'
112BINGET = 'h'
113INST = 'i'
114LONG_BINGET = 'j'
115LIST = 'l'
116EMPTY_LIST = ']'
117OBJ = 'o'
118PUT = 'p'
119BINPUT = 'q'
120LONG_BINPUT = 'r'
121SETITEM = 's'
122TUPLE = 't'
123EMPTY_TUPLE = ')'
124SETITEMS = 'u'
Guido van Rossumd3703791998-10-22 20:15:36 +0000125BINFLOAT = 'G'
Guido van Rossume2763392002-04-05 19:30:08 +0000126TRUE = 'I01\n'
127FALSE = 'I00\n'
Guido van Rossum77f6a652002-04-03 22:41:51 +0000128
Guido van Rossuma48061a1995-01-10 00:31:14 +0000129
Skip Montanaro23bafc62001-02-18 03:10:09 +0000130__all__.extend([x for x in dir() if re.match("[A-Z][A-Z0-9_]+$",x)])
Neal Norwitzd5ba4ae2002-02-11 18:12:06 +0000131del x
Skip Montanaro23bafc62001-02-18 03:10:09 +0000132
Guido van Rossuma48061a1995-01-10 00:31:14 +0000133class Pickler:
134
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000135 def __init__(self, file, bin = 0):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000136 """This takes a file-like object for writing a pickle data stream.
137
138 The optional bin parameter if true, tells the pickler to use the more
139 efficient binary pickle format, otherwise the ASCII format is used
140 (this is the default).
141
142 The file parameter must have a write() method that accepts a single
143 string argument. It can thus be an open file object, a StringIO
144 object, or any other custom object that meets this interface.
145
146 """
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000147 self.write = file.write
148 self.memo = {}
149 self.bin = bin
Guido van Rossuma48061a1995-01-10 00:31:14 +0000150
Fred Drake7f781c92002-05-01 20:33:53 +0000151 def clear_memo(self):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000152 """Clears the pickler's "memo".
153
154 The memo is the data structure that remembers which objects the
155 pickler has already seen, so that shared or recursive objects pickled
156 by reference and not by value. This method is useful when re-using
157 picklers.
158
159 """
Fred Drake7f781c92002-05-01 20:33:53 +0000160 self.memo.clear()
161
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000162 def dump(self, object):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000163 """Write a pickled representation of object to the open file object.
164
165 Either the binary or ASCII format will be used, depending on the
166 value of the bin flag passed to the constructor.
167
168 """
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000169 self.save(object)
170 self.write(STOP)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000171
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000172 def put(self, i):
Tim Petersc32d8242001-04-10 02:48:53 +0000173 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000174 s = mdumps(i)[1:]
Tim Petersc32d8242001-04-10 02:48:53 +0000175 if i < 256:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000176 return BINPUT + s[0]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000177
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000178 return LONG_BINPUT + s
Guido van Rossuma48061a1995-01-10 00:31:14 +0000179
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000180 return PUT + `i` + '\n'
Guido van Rossuma48061a1995-01-10 00:31:14 +0000181
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000182 def get(self, i):
Tim Petersc32d8242001-04-10 02:48:53 +0000183 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000184 s = mdumps(i)[1:]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000185
Tim Petersc32d8242001-04-10 02:48:53 +0000186 if i < 256:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000187 return BINGET + s[0]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000188
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000189 return LONG_BINGET + s
Guido van Rossuma48061a1995-01-10 00:31:14 +0000190
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000191 return GET + `i` + '\n'
Tim Peters2344fae2001-01-15 00:50:52 +0000192
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000193 def save(self, object, pers_save = 0):
194 memo = self.memo
Guido van Rossuma48061a1995-01-10 00:31:14 +0000195
Tim Petersc32d8242001-04-10 02:48:53 +0000196 if not pers_save:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000197 pid = self.persistent_id(object)
Tim Petersc32d8242001-04-10 02:48:53 +0000198 if pid is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000199 self.save_pers(pid)
200 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000201
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000202 d = id(object)
Tim Peters2344fae2001-01-15 00:50:52 +0000203
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000204 t = type(object)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000205
Tim Petersc32d8242001-04-10 02:48:53 +0000206 if (t is TupleType) and (len(object) == 0):
207 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000208 self.save_empty_tuple(object)
209 else:
210 self.save_tuple(object)
211 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000212
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000213 if memo.has_key(d):
214 self.write(self.get(memo[d][0]))
215 return
216
217 try:
218 f = self.dispatch[t]
219 except KeyError:
Guido van Rossum85ee4912002-03-26 00:51:56 +0000220 try:
221 issc = issubclass(t, TypeType)
222 except TypeError: # t is not a class
223 issc = 0
224 if issc:
Guido van Rossumf048a8f2001-12-19 16:55:02 +0000225 self.save_global(object)
226 return
227
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000228 pid = self.inst_persistent_id(object)
229 if pid is not None:
230 self.save_pers(pid)
231 return
232
233 try:
234 reduce = dispatch_table[t]
235 except KeyError:
236 try:
237 reduce = object.__reduce__
238 except AttributeError:
239 raise PicklingError, \
Guido van Rossum08a92cb1999-10-10 21:14:25 +0000240 "can't pickle %s object: %s" % (`t.__name__`,
241 `object`)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000242 else:
243 tup = reduce()
244 else:
245 tup = reduce(object)
246
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000247 if type(tup) is StringType:
248 self.save_global(object, tup)
249 return
Guido van Rossumd1f49841997-12-10 23:40:18 +0000250
Tim Petersc32d8242001-04-10 02:48:53 +0000251 if type(tup) is not TupleType:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000252 raise PicklingError, "Value returned by %s must be a " \
253 "tuple" % reduce
254
255 l = len(tup)
Tim Peters2344fae2001-01-15 00:50:52 +0000256
Tim Petersc32d8242001-04-10 02:48:53 +0000257 if (l != 2) and (l != 3):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000258 raise PicklingError, "tuple returned by %s must contain " \
259 "only two or three elements" % reduce
260
261 callable = tup[0]
262 arg_tup = tup[1]
Tim Peters2344fae2001-01-15 00:50:52 +0000263
Tim Petersc32d8242001-04-10 02:48:53 +0000264 if l > 2:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000265 state = tup[2]
266 else:
267 state = None
268
Guido van Rossumd1f49841997-12-10 23:40:18 +0000269 if type(arg_tup) is not TupleType and arg_tup is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000270 raise PicklingError, "Second element of tuple returned " \
271 "by %s must be a tuple" % reduce
272
Tim Peters2344fae2001-01-15 00:50:52 +0000273 self.save_reduce(callable, arg_tup, state)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000274 memo_len = len(memo)
275 self.write(self.put(memo_len))
276 memo[d] = (memo_len, object)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000277 return
278
279 f(self, object)
280
281 def persistent_id(self, object):
282 return None
283
284 def inst_persistent_id(self, object):
285 return None
286
287 def save_pers(self, pid):
Tim Petersc32d8242001-04-10 02:48:53 +0000288 if not self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000289 self.write(PERSID + str(pid) + '\n')
290 else:
291 self.save(pid, 1)
292 self.write(BINPERSID)
293
294 def save_reduce(self, callable, arg_tup, state = None):
295 write = self.write
296 save = self.save
297
298 save(callable)
299 save(arg_tup)
300 write(REDUCE)
Tim Peters2344fae2001-01-15 00:50:52 +0000301
Tim Petersc32d8242001-04-10 02:48:53 +0000302 if state is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000303 save(state)
304 write(BUILD)
305
306 dispatch = {}
307
308 def save_none(self, object):
309 self.write(NONE)
310 dispatch[NoneType] = save_none
311
Guido van Rossum77f6a652002-04-03 22:41:51 +0000312 def save_bool(self, object):
313 if object:
314 self.write(TRUE)
315 else:
316 self.write(FALSE)
317 dispatch[bool] = save_bool
318
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000319 def save_int(self, object):
Tim Petersc32d8242001-04-10 02:48:53 +0000320 if self.bin:
Tim Peters44714002001-04-10 05:02:52 +0000321 # If the int is small enough to fit in a signed 4-byte 2's-comp
322 # format, we can store it more efficiently than the general
323 # case.
324 high_bits = object >> 31 # note that Python shift sign-extends
325 if high_bits == 0 or high_bits == -1:
326 # All high bits are copies of bit 2**31, so the value
327 # fits in a 4-byte signed int.
328 i = mdumps(object)[1:]
329 assert len(i) == 4
330 if i[-2:] == '\000\000': # fits in 2-byte unsigned int
331 if i[-3] == '\000': # fits in 1-byte unsigned int
332 self.write(BININT1 + i[0])
333 else:
334 self.write(BININT2 + i[:2])
335 else:
336 self.write(BININT + i)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000337 return
Tim Peters44714002001-04-10 05:02:52 +0000338 # Text pickle, or int too big to fit in signed 4-byte format.
339 self.write(INT + `object` + '\n')
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000340 dispatch[IntType] = save_int
341
342 def save_long(self, object):
343 self.write(LONG + `object` + '\n')
344 dispatch[LongType] = save_long
345
Guido van Rossumd3703791998-10-22 20:15:36 +0000346 def save_float(self, object, pack=struct.pack):
347 if self.bin:
348 self.write(BINFLOAT + pack('>d', object))
349 else:
350 self.write(FLOAT + `object` + '\n')
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000351 dispatch[FloatType] = save_float
352
353 def save_string(self, object):
354 d = id(object)
355 memo = self.memo
356
Tim Petersc32d8242001-04-10 02:48:53 +0000357 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000358 l = len(object)
359 s = mdumps(l)[1:]
Tim Petersc32d8242001-04-10 02:48:53 +0000360 if l < 256:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000361 self.write(SHORT_BINSTRING + s[0] + object)
362 else:
363 self.write(BINSTRING + s + object)
364 else:
365 self.write(STRING + `object` + '\n')
366
367 memo_len = len(memo)
368 self.write(self.put(memo_len))
369 memo[d] = (memo_len, object)
370 dispatch[StringType] = save_string
371
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000372 def save_unicode(self, object):
373 d = id(object)
374 memo = self.memo
375
Tim Petersc32d8242001-04-10 02:48:53 +0000376 if self.bin:
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000377 encoding = object.encode('utf-8')
378 l = len(encoding)
379 s = mdumps(l)[1:]
380 self.write(BINUNICODE + s + encoding)
381 else:
Guido van Rossumdbb718f2001-09-21 19:22:34 +0000382 object = object.replace("\\", "\\u005c")
383 object = object.replace("\n", "\\u000a")
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000384 self.write(UNICODE + object.encode('raw-unicode-escape') + '\n')
385
386 memo_len = len(memo)
387 self.write(self.put(memo_len))
388 memo[d] = (memo_len, object)
389 dispatch[UnicodeType] = save_unicode
390
Guido van Rossum31584cb2001-01-22 14:53:29 +0000391 if StringType == UnicodeType:
392 # This is true for Jython
393 def save_string(self, object):
394 d = id(object)
395 memo = self.memo
396 unicode = object.isunicode()
397
Tim Petersc32d8242001-04-10 02:48:53 +0000398 if self.bin:
Guido van Rossum31584cb2001-01-22 14:53:29 +0000399 if unicode:
400 object = object.encode("utf-8")
401 l = len(object)
402 s = mdumps(l)[1:]
Tim Petersc32d8242001-04-10 02:48:53 +0000403 if l < 256 and not unicode:
Guido van Rossum31584cb2001-01-22 14:53:29 +0000404 self.write(SHORT_BINSTRING + s[0] + object)
405 else:
406 if unicode:
407 self.write(BINUNICODE + s + object)
408 else:
409 self.write(BINSTRING + s + object)
410 else:
Tim Peters658cba62001-02-09 20:06:00 +0000411 if unicode:
Guido van Rossumdbb718f2001-09-21 19:22:34 +0000412 object = object.replace("\\", "\\u005c")
413 object = object.replace("\n", "\\u000a")
Guido van Rossum31584cb2001-01-22 14:53:29 +0000414 object = object.encode('raw-unicode-escape')
415 self.write(UNICODE + object + '\n')
416 else:
417 self.write(STRING + `object` + '\n')
418
419 memo_len = len(memo)
420 self.write(self.put(memo_len))
421 memo[d] = (memo_len, object)
422 dispatch[StringType] = save_string
Tim Peters658cba62001-02-09 20:06:00 +0000423
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000424 def save_tuple(self, object):
425
426 write = self.write
427 save = self.save
428 memo = self.memo
429
430 d = id(object)
431
432 write(MARK)
433
434 for element in object:
435 save(element)
436
Tim Petersc32d8242001-04-10 02:48:53 +0000437 if len(object) and memo.has_key(d):
438 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000439 write(POP_MARK + self.get(memo[d][0]))
440 return
Tim Peters2344fae2001-01-15 00:50:52 +0000441
Guido van Rossum599174f1998-03-31 16:30:28 +0000442 write(POP * (len(object) + 1) + self.get(memo[d][0]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000443 return
444
445 memo_len = len(memo)
446 self.write(TUPLE + self.put(memo_len))
447 memo[d] = (memo_len, object)
448 dispatch[TupleType] = save_tuple
449
450 def save_empty_tuple(self, object):
451 self.write(EMPTY_TUPLE)
452
453 def save_list(self, object):
454 d = id(object)
455
456 write = self.write
457 save = self.save
458 memo = self.memo
459
Tim Petersc32d8242001-04-10 02:48:53 +0000460 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000461 write(EMPTY_LIST)
462 else:
463 write(MARK + LIST)
464
465 memo_len = len(memo)
466 write(self.put(memo_len))
467 memo[d] = (memo_len, object)
468
469 using_appends = (self.bin and (len(object) > 1))
470
Tim Petersc32d8242001-04-10 02:48:53 +0000471 if using_appends:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000472 write(MARK)
473
474 for element in object:
475 save(element)
Tim Peters2344fae2001-01-15 00:50:52 +0000476
Tim Petersc32d8242001-04-10 02:48:53 +0000477 if not using_appends:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000478 write(APPEND)
479
Tim Petersc32d8242001-04-10 02:48:53 +0000480 if using_appends:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000481 write(APPENDS)
482 dispatch[ListType] = save_list
483
484 def save_dict(self, object):
485 d = id(object)
486
487 write = self.write
488 save = self.save
489 memo = self.memo
490
Tim Petersc32d8242001-04-10 02:48:53 +0000491 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000492 write(EMPTY_DICT)
493 else:
494 write(MARK + DICT)
495
496 memo_len = len(memo)
497 self.write(self.put(memo_len))
498 memo[d] = (memo_len, object)
499
500 using_setitems = (self.bin and (len(object) > 1))
501
Tim Petersc32d8242001-04-10 02:48:53 +0000502 if using_setitems:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000503 write(MARK)
504
505 items = object.items()
506 for key, value in items:
507 save(key)
508 save(value)
509
Tim Petersc32d8242001-04-10 02:48:53 +0000510 if not using_setitems:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000511 write(SETITEM)
512
Tim Petersc32d8242001-04-10 02:48:53 +0000513 if using_setitems:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000514 write(SETITEMS)
515
516 dispatch[DictionaryType] = save_dict
Jeremy Hylton2b9d0291998-05-27 22:38:22 +0000517 if not PyStringMap is None:
518 dispatch[PyStringMap] = save_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000519
520 def save_inst(self, object):
521 d = id(object)
522 cls = object.__class__
523
524 memo = self.memo
525 write = self.write
526 save = self.save
527
528 if hasattr(object, '__getinitargs__'):
529 args = object.__getinitargs__()
530 len(args) # XXX Assert it's a sequence
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000531 _keep_alive(args, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000532 else:
533 args = ()
534
535 write(MARK)
536
Tim Petersc32d8242001-04-10 02:48:53 +0000537 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000538 save(cls)
539
540 for arg in args:
541 save(arg)
542
543 memo_len = len(memo)
Tim Petersc32d8242001-04-10 02:48:53 +0000544 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000545 write(OBJ + self.put(memo_len))
546 else:
Guido van Rossum4fb5b281997-09-12 20:07:24 +0000547 write(INST + cls.__module__ + '\n' + cls.__name__ + '\n' +
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000548 self.put(memo_len))
549
550 memo[d] = (memo_len, object)
551
552 try:
553 getstate = object.__getstate__
554 except AttributeError:
555 stuff = object.__dict__
556 else:
557 stuff = getstate()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000558 _keep_alive(stuff, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000559 save(stuff)
560 write(BUILD)
561 dispatch[InstanceType] = save_inst
562
563 def save_global(self, object, name = None):
564 write = self.write
565 memo = self.memo
566
Tim Petersc32d8242001-04-10 02:48:53 +0000567 if name is None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000568 name = object.__name__
569
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000570 try:
571 module = object.__module__
572 except AttributeError:
573 module = whichmodule(object, name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000574
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000575 try:
576 __import__(module)
577 mod = sys.modules[module]
578 klass = getattr(mod, name)
579 except (ImportError, KeyError, AttributeError):
580 raise PicklingError(
581 "Can't pickle %r: it's not found as %s.%s" %
582 (object, module, name))
583 else:
584 if klass is not object:
585 raise PicklingError(
586 "Can't pickle %r: it's not the same object as %s.%s" %
587 (object, module, name))
588
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000589 memo_len = len(memo)
590 write(GLOBAL + module + '\n' + name + '\n' +
591 self.put(memo_len))
592 memo[id(object)] = (memo_len, object)
593 dispatch[ClassType] = save_global
594 dispatch[FunctionType] = save_global
595 dispatch[BuiltinFunctionType] = save_global
Tim Peters6d6c1a32001-08-02 04:15:00 +0000596 dispatch[TypeType] = save_global
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000597
Guido van Rossuma48061a1995-01-10 00:31:14 +0000598
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000599def _keep_alive(x, memo):
600 """Keeps a reference to the object x in the memo.
601
602 Because we remember objects by their id, we have
603 to assure that possibly temporary objects are kept
604 alive by referencing them.
605 We store a reference at the id of the memo, which should
606 normally not be used unless someone tries to deepcopy
607 the memo itself...
608 """
609 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000610 memo[id(memo)].append(x)
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000611 except KeyError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000612 # aha, this is the first one :-)
613 memo[id(memo)]=[x]
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000614
615
Guido van Rossuma48061a1995-01-10 00:31:14 +0000616classmap = {}
617
Guido van Rossum4fb5b281997-09-12 20:07:24 +0000618# This is no longer used to find classes, but still for functions
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000619def whichmodule(cls, clsname):
620 """Figure out the module in which a class occurs.
Guido van Rossuma48061a1995-01-10 00:31:14 +0000621
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000622 Search sys.modules for the module.
623 Cache in classmap.
624 Return a module name.
625 If the class cannot be found, return __main__.
626 """
627 if classmap.has_key(cls):
628 return classmap[cls]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000629
630 for name, module in sys.modules.items():
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000631 if name != '__main__' and \
632 hasattr(module, clsname) and \
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000633 getattr(module, clsname) is cls:
634 break
635 else:
636 name = '__main__'
637 classmap[cls] = name
638 return name
Guido van Rossuma48061a1995-01-10 00:31:14 +0000639
640
641class Unpickler:
642
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000643 def __init__(self, file):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000644 """This takes a file-like object for reading a pickle data stream.
645
646 This class automatically determines whether the data stream was
647 written in binary mode or not, so it does not need a flag as in
648 the Pickler class factory.
649
650 The file-like object must have two methods, a read() method that
651 takes an integer argument, and a readline() method that requires no
652 arguments. Both methods should return a string. Thus file-like
653 object can be a file object opened for reading, a StringIO object,
654 or any other custom object that meets this interface.
655
656 """
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000657 self.readline = file.readline
658 self.read = file.read
659 self.memo = {}
Guido van Rossuma48061a1995-01-10 00:31:14 +0000660
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000661 def load(self):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000662 """Read a pickled object representation from the open file object.
663
664 Return the reconstituted object hierarchy specified in the file
665 object.
666
667 """
Jeremy Hylton20747fa2001-11-09 16:15:04 +0000668 self.mark = object() # any new unique object
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000669 self.stack = []
670 self.append = self.stack.append
671 read = self.read
672 dispatch = self.dispatch
673 try:
674 while 1:
675 key = read(1)
676 dispatch[key](self)
Guido van Rossumff871742000-12-13 18:11:56 +0000677 except _Stop, stopinst:
678 return stopinst.value
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000679
680 def marker(self):
681 stack = self.stack
682 mark = self.mark
683 k = len(stack)-1
684 while stack[k] is not mark: k = k-1
685 return k
686
687 dispatch = {}
688
689 def load_eof(self):
690 raise EOFError
691 dispatch[''] = load_eof
692
693 def load_persid(self):
694 pid = self.readline()[:-1]
695 self.append(self.persistent_load(pid))
696 dispatch[PERSID] = load_persid
697
698 def load_binpersid(self):
699 stack = self.stack
Tim Peters2344fae2001-01-15 00:50:52 +0000700
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000701 pid = stack[-1]
702 del stack[-1]
703
704 self.append(self.persistent_load(pid))
705 dispatch[BINPERSID] = load_binpersid
706
707 def load_none(self):
708 self.append(None)
709 dispatch[NONE] = load_none
710
711 def load_int(self):
Tim Peters19ef62d2001-08-28 22:21:18 +0000712 data = self.readline()
Guido van Rossume2763392002-04-05 19:30:08 +0000713 if data == FALSE[1:]:
714 val = False
715 elif data == TRUE[1:]:
716 val = True
717 else:
718 try:
719 val = int(data)
720 except ValueError:
721 val = long(data)
722 self.append(val)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000723 dispatch[INT] = load_int
724
725 def load_binint(self):
726 self.append(mloads('i' + self.read(4)))
727 dispatch[BININT] = load_binint
728
729 def load_binint1(self):
730 self.append(mloads('i' + self.read(1) + '\000\000\000'))
731 dispatch[BININT1] = load_binint1
732
733 def load_binint2(self):
734 self.append(mloads('i' + self.read(2) + '\000\000'))
735 dispatch[BININT2] = load_binint2
Tim Peters2344fae2001-01-15 00:50:52 +0000736
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000737 def load_long(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000738 self.append(long(self.readline()[:-1], 0))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000739 dispatch[LONG] = load_long
740
741 def load_float(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000742 self.append(float(self.readline()[:-1]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000743 dispatch[FLOAT] = load_float
744
Guido van Rossumd3703791998-10-22 20:15:36 +0000745 def load_binfloat(self, unpack=struct.unpack):
746 self.append(unpack('>d', self.read(8))[0])
747 dispatch[BINFLOAT] = load_binfloat
748
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000749 def load_string(self):
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000750 rep = self.readline()[:-1]
751 if not self._is_string_secure(rep):
752 raise ValueError, "insecure string pickle"
753 self.append(eval(rep,
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000754 {'__builtins__': {}})) # Let's be careful
755 dispatch[STRING] = load_string
756
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000757 def _is_string_secure(self, s):
758 """Return true if s contains a string that is safe to eval
759
760 The definition of secure string is based on the implementation
761 in cPickle. s is secure as long as it only contains a quoted
762 string and optional trailing whitespace.
763 """
764 q = s[0]
765 if q not in ("'", '"'):
766 return 0
767 # find the closing quote
768 offset = 1
769 i = None
770 while 1:
771 try:
772 i = s.index(q, offset)
773 except ValueError:
774 # if there is an error the first time, there is no
775 # close quote
776 if offset == 1:
777 return 0
778 if s[i-1] != '\\':
779 break
780 # check to see if this one is escaped
781 nslash = 0
782 j = i - 1
783 while j >= offset and s[j] == '\\':
784 j = j - 1
785 nslash = nslash + 1
786 if nslash % 2 == 0:
787 break
788 offset = i + 1
789 for c in s[i+1:]:
790 if ord(c) > 32:
791 return 0
792 return 1
793
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000794 def load_binstring(self):
795 len = mloads('i' + self.read(4))
796 self.append(self.read(len))
797 dispatch[BINSTRING] = load_binstring
798
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000799 def load_unicode(self):
800 self.append(unicode(self.readline()[:-1],'raw-unicode-escape'))
801 dispatch[UNICODE] = load_unicode
802
803 def load_binunicode(self):
804 len = mloads('i' + self.read(4))
805 self.append(unicode(self.read(len),'utf-8'))
806 dispatch[BINUNICODE] = load_binunicode
807
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000808 def load_short_binstring(self):
809 len = mloads('i' + self.read(1) + '\000\000\000')
810 self.append(self.read(len))
811 dispatch[SHORT_BINSTRING] = load_short_binstring
812
813 def load_tuple(self):
814 k = self.marker()
815 self.stack[k:] = [tuple(self.stack[k+1:])]
816 dispatch[TUPLE] = load_tuple
817
818 def load_empty_tuple(self):
819 self.stack.append(())
820 dispatch[EMPTY_TUPLE] = load_empty_tuple
821
822 def load_empty_list(self):
823 self.stack.append([])
824 dispatch[EMPTY_LIST] = load_empty_list
825
826 def load_empty_dictionary(self):
827 self.stack.append({})
828 dispatch[EMPTY_DICT] = load_empty_dictionary
829
830 def load_list(self):
831 k = self.marker()
832 self.stack[k:] = [self.stack[k+1:]]
833 dispatch[LIST] = load_list
834
835 def load_dict(self):
836 k = self.marker()
837 d = {}
838 items = self.stack[k+1:]
839 for i in range(0, len(items), 2):
840 key = items[i]
841 value = items[i+1]
842 d[key] = value
843 self.stack[k:] = [d]
844 dispatch[DICT] = load_dict
845
846 def load_inst(self):
847 k = self.marker()
848 args = tuple(self.stack[k+1:])
849 del self.stack[k:]
850 module = self.readline()[:-1]
851 name = self.readline()[:-1]
852 klass = self.find_class(module, name)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000853 instantiated = 0
854 if (not args and type(klass) is ClassType and
855 not hasattr(klass, "__getinitargs__")):
856 try:
857 value = _EmptyClass()
858 value.__class__ = klass
Guido van Rossumb19e2a31998-04-13 18:08:45 +0000859 instantiated = 1
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000860 except RuntimeError:
861 # In restricted execution, assignment to inst.__class__ is
862 # prohibited
863 pass
864 if not instantiated:
Guido van Rossum743d17e1998-09-15 20:25:57 +0000865 try:
Barry Warsawbf4d9592001-11-15 23:42:58 +0000866 if not hasattr(klass, '__safe_for_unpickling__'):
867 raise UnpicklingError('%s is not safe for unpickling' %
868 klass)
Guido van Rossum743d17e1998-09-15 20:25:57 +0000869 value = apply(klass, args)
870 except TypeError, err:
871 raise TypeError, "in constructor for %s: %s" % (
872 klass.__name__, str(err)), sys.exc_info()[2]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000873 self.append(value)
874 dispatch[INST] = load_inst
875
876 def load_obj(self):
877 stack = self.stack
878 k = self.marker()
879 klass = stack[k + 1]
880 del stack[k + 1]
Tim Peters2344fae2001-01-15 00:50:52 +0000881 args = tuple(stack[k + 1:])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000882 del stack[k:]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000883 instantiated = 0
884 if (not args and type(klass) is ClassType and
885 not hasattr(klass, "__getinitargs__")):
886 try:
887 value = _EmptyClass()
888 value.__class__ = klass
889 instantiated = 1
890 except RuntimeError:
891 # In restricted execution, assignment to inst.__class__ is
892 # prohibited
893 pass
894 if not instantiated:
895 value = apply(klass, args)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000896 self.append(value)
Tim Peters2344fae2001-01-15 00:50:52 +0000897 dispatch[OBJ] = load_obj
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000898
899 def load_global(self):
900 module = self.readline()[:-1]
901 name = self.readline()[:-1]
902 klass = self.find_class(module, name)
903 self.append(klass)
904 dispatch[GLOBAL] = load_global
905
906 def find_class(self, module, name):
Barry Warsawbf4d9592001-11-15 23:42:58 +0000907 __import__(module)
908 mod = sys.modules[module]
909 klass = getattr(mod, name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000910 return klass
911
912 def load_reduce(self):
913 stack = self.stack
914
915 callable = stack[-2]
916 arg_tup = stack[-1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000917 del stack[-2:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000918
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000919 if type(callable) is not ClassType:
920 if not safe_constructors.has_key(callable):
921 try:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000922 safe = callable.__safe_for_unpickling__
923 except AttributeError:
924 safe = None
Guido van Rossuma48061a1995-01-10 00:31:14 +0000925
Tim Petersc32d8242001-04-10 02:48:53 +0000926 if not safe:
Tim Peters2344fae2001-01-15 00:50:52 +0000927 raise UnpicklingError, "%s is not safe for " \
928 "unpickling" % callable
Guido van Rossuma48061a1995-01-10 00:31:14 +0000929
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000930 if arg_tup is None:
Raymond Hettinger97394bc2002-05-21 17:22:02 +0000931 import warnings
932 warnings.warn("The None return argument form of __reduce__ is "
933 "deprecated. Return a tuple of arguments instead.",
Tim Peters8ac14952002-05-23 15:15:30 +0000934 DeprecationWarning)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000935 value = callable.__basicnew__()
936 else:
937 value = apply(callable, arg_tup)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000938 self.append(value)
939 dispatch[REDUCE] = load_reduce
Guido van Rossuma48061a1995-01-10 00:31:14 +0000940
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000941 def load_pop(self):
942 del self.stack[-1]
943 dispatch[POP] = load_pop
Guido van Rossum7b5430f1995-03-04 22:25:21 +0000944
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000945 def load_pop_mark(self):
946 k = self.marker()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000947 del self.stack[k:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000948 dispatch[POP_MARK] = load_pop_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +0000949
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000950 def load_dup(self):
Guido van Rossumb1062fc1998-03-31 17:00:46 +0000951 self.append(self.stack[-1])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000952 dispatch[DUP] = load_dup
Guido van Rossuma48061a1995-01-10 00:31:14 +0000953
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000954 def load_get(self):
955 self.append(self.memo[self.readline()[:-1]])
956 dispatch[GET] = load_get
Guido van Rossum78536471996-04-12 13:36:27 +0000957
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000958 def load_binget(self):
959 i = mloads('i' + self.read(1) + '\000\000\000')
960 self.append(self.memo[`i`])
961 dispatch[BINGET] = load_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000962
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000963 def load_long_binget(self):
964 i = mloads('i' + self.read(4))
965 self.append(self.memo[`i`])
966 dispatch[LONG_BINGET] = load_long_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000967
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000968 def load_put(self):
969 self.memo[self.readline()[:-1]] = self.stack[-1]
970 dispatch[PUT] = load_put
Guido van Rossuma48061a1995-01-10 00:31:14 +0000971
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000972 def load_binput(self):
973 i = mloads('i' + self.read(1) + '\000\000\000')
974 self.memo[`i`] = self.stack[-1]
975 dispatch[BINPUT] = load_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000976
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000977 def load_long_binput(self):
978 i = mloads('i' + self.read(4))
979 self.memo[`i`] = self.stack[-1]
980 dispatch[LONG_BINPUT] = load_long_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000981
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000982 def load_append(self):
983 stack = self.stack
984 value = stack[-1]
985 del stack[-1]
986 list = stack[-1]
987 list.append(value)
988 dispatch[APPEND] = load_append
Guido van Rossuma48061a1995-01-10 00:31:14 +0000989
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000990 def load_appends(self):
991 stack = self.stack
992 mark = self.marker()
993 list = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000994 for i in range(mark + 1, len(stack)):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000995 list.append(stack[i])
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000996
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000997 del stack[mark:]
998 dispatch[APPENDS] = load_appends
Tim Peters2344fae2001-01-15 00:50:52 +0000999
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001000 def load_setitem(self):
1001 stack = self.stack
1002 value = stack[-1]
1003 key = stack[-2]
1004 del stack[-2:]
1005 dict = stack[-1]
1006 dict[key] = value
1007 dispatch[SETITEM] = load_setitem
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001008
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001009 def load_setitems(self):
1010 stack = self.stack
1011 mark = self.marker()
1012 dict = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001013 for i in range(mark + 1, len(stack), 2):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001014 dict[stack[i]] = stack[i + 1]
Guido van Rossuma48061a1995-01-10 00:31:14 +00001015
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001016 del stack[mark:]
1017 dispatch[SETITEMS] = load_setitems
Guido van Rossuma48061a1995-01-10 00:31:14 +00001018
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001019 def load_build(self):
1020 stack = self.stack
1021 value = stack[-1]
1022 del stack[-1]
1023 inst = stack[-1]
1024 try:
1025 setstate = inst.__setstate__
1026 except AttributeError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +00001027 try:
1028 inst.__dict__.update(value)
1029 except RuntimeError:
1030 # XXX In restricted execution, the instance's __dict__ is not
1031 # accessible. Use the old way of unpickling the instance
1032 # variables. This is a semantic different when unpickling in
1033 # restricted vs. unrestricted modes.
1034 for k, v in value.items():
1035 setattr(inst, k, v)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001036 else:
1037 setstate(value)
1038 dispatch[BUILD] = load_build
Guido van Rossuma48061a1995-01-10 00:31:14 +00001039
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001040 def load_mark(self):
1041 self.append(self.mark)
1042 dispatch[MARK] = load_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +00001043
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001044 def load_stop(self):
1045 value = self.stack[-1]
1046 del self.stack[-1]
Guido van Rossumff871742000-12-13 18:11:56 +00001047 raise _Stop(value)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001048 dispatch[STOP] = load_stop
Guido van Rossuma48061a1995-01-10 00:31:14 +00001049
Guido van Rossume467be61997-12-05 19:42:42 +00001050# Helper class for load_inst/load_obj
1051
1052class _EmptyClass:
1053 pass
Guido van Rossuma48061a1995-01-10 00:31:14 +00001054
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001055# Shorthands
1056
Jeremy Hyltonabe2c622001-10-15 21:29:28 +00001057try:
1058 from cStringIO import StringIO
1059except ImportError:
1060 from StringIO import StringIO
Guido van Rossumc7c5e691996-07-22 22:26:07 +00001061
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001062def dump(object, file, bin = 0):
1063 Pickler(file, bin).dump(object)
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001064
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001065def dumps(object, bin = 0):
1066 file = StringIO()
1067 Pickler(file, bin).dump(object)
1068 return file.getvalue()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001069
1070def load(file):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001071 return Unpickler(file).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001072
1073def loads(str):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001074 file = StringIO(str)
1075 return Unpickler(file).load()