blob: 21ea21536fa664c099b070095136b7588b1a7760 [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
Guido van Rossum26e89d02000-06-29 16:15:52 +000044class PickleError(Exception): pass
45class PicklingError(PickleError): pass
46class UnpicklingError(PickleError): pass
Guido van Rossum7849da81995-03-09 14:08:35 +000047
Guido van Rossumff871742000-12-13 18:11:56 +000048class _Stop(Exception):
49 def __init__(self, value):
50 self.value = value
51
Jeremy Hylton2b9d0291998-05-27 22:38:22 +000052try:
53 from org.python.core import PyStringMap
54except ImportError:
55 PyStringMap = None
56
Guido van Rossumdbb718f2001-09-21 19:22:34 +000057try:
58 UnicodeType
59except NameError:
60 UnicodeType = None
61
62
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000063MARK = '('
64STOP = '.'
65POP = '0'
66POP_MARK = '1'
67DUP = '2'
68FLOAT = 'F'
69INT = 'I'
70BININT = 'J'
71BININT1 = 'K'
72LONG = 'L'
73BININT2 = 'M'
74NONE = 'N'
75PERSID = 'P'
76BINPERSID = 'Q'
77REDUCE = 'R'
78STRING = 'S'
79BINSTRING = 'T'
80SHORT_BINSTRING = 'U'
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +000081UNICODE = 'V'
82BINUNICODE = 'X'
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000083APPEND = 'a'
84BUILD = 'b'
85GLOBAL = 'c'
86DICT = 'd'
87EMPTY_DICT = '}'
88APPENDS = 'e'
89GET = 'g'
90BINGET = 'h'
91INST = 'i'
92LONG_BINGET = 'j'
93LIST = 'l'
94EMPTY_LIST = ']'
95OBJ = 'o'
96PUT = 'p'
97BINPUT = 'q'
98LONG_BINPUT = 'r'
99SETITEM = 's'
100TUPLE = 't'
101EMPTY_TUPLE = ')'
102SETITEMS = 'u'
Guido van Rossumd3703791998-10-22 20:15:36 +0000103BINFLOAT = 'G'
Guido van Rossuma48061a1995-01-10 00:31:14 +0000104
Skip Montanaro23bafc62001-02-18 03:10:09 +0000105__all__.extend([x for x in dir() if re.match("[A-Z][A-Z0-9_]+$",x)])
Neal Norwitzd5ba4ae2002-02-11 18:12:06 +0000106del x
Skip Montanaro23bafc62001-02-18 03:10:09 +0000107
Guido van Rossuma48061a1995-01-10 00:31:14 +0000108class Pickler:
109
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000110 def __init__(self, file, bin = 0):
111 self.write = file.write
112 self.memo = {}
113 self.bin = bin
Guido van Rossuma48061a1995-01-10 00:31:14 +0000114
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000115 def dump(self, object):
116 self.save(object)
117 self.write(STOP)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000118
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000119 def put(self, i):
Tim Petersc32d8242001-04-10 02:48:53 +0000120 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000121 s = mdumps(i)[1:]
Tim Petersc32d8242001-04-10 02:48:53 +0000122 if i < 256:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000123 return BINPUT + s[0]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000124
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000125 return LONG_BINPUT + s
Guido van Rossuma48061a1995-01-10 00:31:14 +0000126
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000127 return PUT + `i` + '\n'
Guido van Rossuma48061a1995-01-10 00:31:14 +0000128
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000129 def get(self, i):
Tim Petersc32d8242001-04-10 02:48:53 +0000130 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000131 s = mdumps(i)[1:]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000132
Tim Petersc32d8242001-04-10 02:48:53 +0000133 if i < 256:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000134 return BINGET + s[0]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000135
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000136 return LONG_BINGET + s
Guido van Rossuma48061a1995-01-10 00:31:14 +0000137
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000138 return GET + `i` + '\n'
Tim Peters2344fae2001-01-15 00:50:52 +0000139
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000140 def save(self, object, pers_save = 0):
141 memo = self.memo
Guido van Rossuma48061a1995-01-10 00:31:14 +0000142
Tim Petersc32d8242001-04-10 02:48:53 +0000143 if not pers_save:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000144 pid = self.persistent_id(object)
Tim Petersc32d8242001-04-10 02:48:53 +0000145 if pid is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000146 self.save_pers(pid)
147 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000148
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000149 d = id(object)
Tim Peters2344fae2001-01-15 00:50:52 +0000150
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000151 t = type(object)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000152
Tim Petersc32d8242001-04-10 02:48:53 +0000153 if (t is TupleType) and (len(object) == 0):
154 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000155 self.save_empty_tuple(object)
156 else:
157 self.save_tuple(object)
158 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000159
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000160 if memo.has_key(d):
161 self.write(self.get(memo[d][0]))
162 return
163
164 try:
165 f = self.dispatch[t]
166 except KeyError:
Guido van Rossum85ee4912002-03-26 00:51:56 +0000167 try:
168 issc = issubclass(t, TypeType)
169 except TypeError: # t is not a class
170 issc = 0
171 if issc:
Guido van Rossumf048a8f2001-12-19 16:55:02 +0000172 self.save_global(object)
173 return
174
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000175 pid = self.inst_persistent_id(object)
176 if pid is not None:
177 self.save_pers(pid)
178 return
179
180 try:
181 reduce = dispatch_table[t]
182 except KeyError:
183 try:
184 reduce = object.__reduce__
185 except AttributeError:
186 raise PicklingError, \
Guido van Rossum08a92cb1999-10-10 21:14:25 +0000187 "can't pickle %s object: %s" % (`t.__name__`,
188 `object`)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000189 else:
190 tup = reduce()
191 else:
192 tup = reduce(object)
193
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000194 if type(tup) is StringType:
195 self.save_global(object, tup)
196 return
Guido van Rossumd1f49841997-12-10 23:40:18 +0000197
Tim Petersc32d8242001-04-10 02:48:53 +0000198 if type(tup) is not TupleType:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000199 raise PicklingError, "Value returned by %s must be a " \
200 "tuple" % reduce
201
202 l = len(tup)
Tim Peters2344fae2001-01-15 00:50:52 +0000203
Tim Petersc32d8242001-04-10 02:48:53 +0000204 if (l != 2) and (l != 3):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000205 raise PicklingError, "tuple returned by %s must contain " \
206 "only two or three elements" % reduce
207
208 callable = tup[0]
209 arg_tup = tup[1]
Tim Peters2344fae2001-01-15 00:50:52 +0000210
Tim Petersc32d8242001-04-10 02:48:53 +0000211 if l > 2:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000212 state = tup[2]
213 else:
214 state = None
215
Guido van Rossumd1f49841997-12-10 23:40:18 +0000216 if type(arg_tup) is not TupleType and arg_tup is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000217 raise PicklingError, "Second element of tuple returned " \
218 "by %s must be a tuple" % reduce
219
Tim Peters2344fae2001-01-15 00:50:52 +0000220 self.save_reduce(callable, arg_tup, state)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000221 memo_len = len(memo)
222 self.write(self.put(memo_len))
223 memo[d] = (memo_len, object)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000224 return
225
226 f(self, object)
227
228 def persistent_id(self, object):
229 return None
230
231 def inst_persistent_id(self, object):
232 return None
233
234 def save_pers(self, pid):
Tim Petersc32d8242001-04-10 02:48:53 +0000235 if not self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000236 self.write(PERSID + str(pid) + '\n')
237 else:
238 self.save(pid, 1)
239 self.write(BINPERSID)
240
241 def save_reduce(self, callable, arg_tup, state = None):
242 write = self.write
243 save = self.save
244
245 save(callable)
246 save(arg_tup)
247 write(REDUCE)
Tim Peters2344fae2001-01-15 00:50:52 +0000248
Tim Petersc32d8242001-04-10 02:48:53 +0000249 if state is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000250 save(state)
251 write(BUILD)
252
253 dispatch = {}
254
255 def save_none(self, object):
256 self.write(NONE)
257 dispatch[NoneType] = save_none
258
259 def save_int(self, object):
Tim Petersc32d8242001-04-10 02:48:53 +0000260 if self.bin:
Tim Peters44714002001-04-10 05:02:52 +0000261 # If the int is small enough to fit in a signed 4-byte 2's-comp
262 # format, we can store it more efficiently than the general
263 # case.
264 high_bits = object >> 31 # note that Python shift sign-extends
265 if high_bits == 0 or high_bits == -1:
266 # All high bits are copies of bit 2**31, so the value
267 # fits in a 4-byte signed int.
268 i = mdumps(object)[1:]
269 assert len(i) == 4
270 if i[-2:] == '\000\000': # fits in 2-byte unsigned int
271 if i[-3] == '\000': # fits in 1-byte unsigned int
272 self.write(BININT1 + i[0])
273 else:
274 self.write(BININT2 + i[:2])
275 else:
276 self.write(BININT + i)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000277 return
Tim Peters44714002001-04-10 05:02:52 +0000278 # Text pickle, or int too big to fit in signed 4-byte format.
279 self.write(INT + `object` + '\n')
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000280 dispatch[IntType] = save_int
281
282 def save_long(self, object):
283 self.write(LONG + `object` + '\n')
284 dispatch[LongType] = save_long
285
Guido van Rossumd3703791998-10-22 20:15:36 +0000286 def save_float(self, object, pack=struct.pack):
287 if self.bin:
288 self.write(BINFLOAT + pack('>d', object))
289 else:
290 self.write(FLOAT + `object` + '\n')
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000291 dispatch[FloatType] = save_float
292
293 def save_string(self, object):
294 d = id(object)
295 memo = self.memo
296
Tim Petersc32d8242001-04-10 02:48:53 +0000297 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000298 l = len(object)
299 s = mdumps(l)[1:]
Tim Petersc32d8242001-04-10 02:48:53 +0000300 if l < 256:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000301 self.write(SHORT_BINSTRING + s[0] + object)
302 else:
303 self.write(BINSTRING + s + object)
304 else:
305 self.write(STRING + `object` + '\n')
306
307 memo_len = len(memo)
308 self.write(self.put(memo_len))
309 memo[d] = (memo_len, object)
310 dispatch[StringType] = save_string
311
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000312 def save_unicode(self, object):
313 d = id(object)
314 memo = self.memo
315
Tim Petersc32d8242001-04-10 02:48:53 +0000316 if self.bin:
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000317 encoding = object.encode('utf-8')
318 l = len(encoding)
319 s = mdumps(l)[1:]
320 self.write(BINUNICODE + s + encoding)
321 else:
Guido van Rossumdbb718f2001-09-21 19:22:34 +0000322 object = object.replace("\\", "\\u005c")
323 object = object.replace("\n", "\\u000a")
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000324 self.write(UNICODE + object.encode('raw-unicode-escape') + '\n')
325
326 memo_len = len(memo)
327 self.write(self.put(memo_len))
328 memo[d] = (memo_len, object)
329 dispatch[UnicodeType] = save_unicode
330
Guido van Rossum31584cb2001-01-22 14:53:29 +0000331 if StringType == UnicodeType:
332 # This is true for Jython
333 def save_string(self, object):
334 d = id(object)
335 memo = self.memo
336 unicode = object.isunicode()
337
Tim Petersc32d8242001-04-10 02:48:53 +0000338 if self.bin:
Guido van Rossum31584cb2001-01-22 14:53:29 +0000339 if unicode:
340 object = object.encode("utf-8")
341 l = len(object)
342 s = mdumps(l)[1:]
Tim Petersc32d8242001-04-10 02:48:53 +0000343 if l < 256 and not unicode:
Guido van Rossum31584cb2001-01-22 14:53:29 +0000344 self.write(SHORT_BINSTRING + s[0] + object)
345 else:
346 if unicode:
347 self.write(BINUNICODE + s + object)
348 else:
349 self.write(BINSTRING + s + object)
350 else:
Tim Peters658cba62001-02-09 20:06:00 +0000351 if unicode:
Guido van Rossumdbb718f2001-09-21 19:22:34 +0000352 object = object.replace("\\", "\\u005c")
353 object = object.replace("\n", "\\u000a")
Guido van Rossum31584cb2001-01-22 14:53:29 +0000354 object = object.encode('raw-unicode-escape')
355 self.write(UNICODE + object + '\n')
356 else:
357 self.write(STRING + `object` + '\n')
358
359 memo_len = len(memo)
360 self.write(self.put(memo_len))
361 memo[d] = (memo_len, object)
362 dispatch[StringType] = save_string
Tim Peters658cba62001-02-09 20:06:00 +0000363
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000364 def save_tuple(self, object):
365
366 write = self.write
367 save = self.save
368 memo = self.memo
369
370 d = id(object)
371
372 write(MARK)
373
374 for element in object:
375 save(element)
376
Tim Petersc32d8242001-04-10 02:48:53 +0000377 if len(object) and memo.has_key(d):
378 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000379 write(POP_MARK + self.get(memo[d][0]))
380 return
Tim Peters2344fae2001-01-15 00:50:52 +0000381
Guido van Rossum599174f1998-03-31 16:30:28 +0000382 write(POP * (len(object) + 1) + self.get(memo[d][0]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000383 return
384
385 memo_len = len(memo)
386 self.write(TUPLE + self.put(memo_len))
387 memo[d] = (memo_len, object)
388 dispatch[TupleType] = save_tuple
389
390 def save_empty_tuple(self, object):
391 self.write(EMPTY_TUPLE)
392
393 def save_list(self, object):
394 d = id(object)
395
396 write = self.write
397 save = self.save
398 memo = self.memo
399
Tim Petersc32d8242001-04-10 02:48:53 +0000400 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000401 write(EMPTY_LIST)
402 else:
403 write(MARK + LIST)
404
405 memo_len = len(memo)
406 write(self.put(memo_len))
407 memo[d] = (memo_len, object)
408
409 using_appends = (self.bin and (len(object) > 1))
410
Tim Petersc32d8242001-04-10 02:48:53 +0000411 if using_appends:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000412 write(MARK)
413
414 for element in object:
415 save(element)
Tim Peters2344fae2001-01-15 00:50:52 +0000416
Tim Petersc32d8242001-04-10 02:48:53 +0000417 if not using_appends:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000418 write(APPEND)
419
Tim Petersc32d8242001-04-10 02:48:53 +0000420 if using_appends:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000421 write(APPENDS)
422 dispatch[ListType] = save_list
423
424 def save_dict(self, object):
425 d = id(object)
426
427 write = self.write
428 save = self.save
429 memo = self.memo
430
Tim Petersc32d8242001-04-10 02:48:53 +0000431 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000432 write(EMPTY_DICT)
433 else:
434 write(MARK + DICT)
435
436 memo_len = len(memo)
437 self.write(self.put(memo_len))
438 memo[d] = (memo_len, object)
439
440 using_setitems = (self.bin and (len(object) > 1))
441
Tim Petersc32d8242001-04-10 02:48:53 +0000442 if using_setitems:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000443 write(MARK)
444
445 items = object.items()
446 for key, value in items:
447 save(key)
448 save(value)
449
Tim Petersc32d8242001-04-10 02:48:53 +0000450 if not using_setitems:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000451 write(SETITEM)
452
Tim Petersc32d8242001-04-10 02:48:53 +0000453 if using_setitems:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000454 write(SETITEMS)
455
456 dispatch[DictionaryType] = save_dict
Jeremy Hylton2b9d0291998-05-27 22:38:22 +0000457 if not PyStringMap is None:
458 dispatch[PyStringMap] = save_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000459
460 def save_inst(self, object):
461 d = id(object)
462 cls = object.__class__
463
464 memo = self.memo
465 write = self.write
466 save = self.save
467
468 if hasattr(object, '__getinitargs__'):
469 args = object.__getinitargs__()
470 len(args) # XXX Assert it's a sequence
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000471 _keep_alive(args, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000472 else:
473 args = ()
474
475 write(MARK)
476
Tim Petersc32d8242001-04-10 02:48:53 +0000477 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000478 save(cls)
479
480 for arg in args:
481 save(arg)
482
483 memo_len = len(memo)
Tim Petersc32d8242001-04-10 02:48:53 +0000484 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000485 write(OBJ + self.put(memo_len))
486 else:
Guido van Rossum4fb5b281997-09-12 20:07:24 +0000487 write(INST + cls.__module__ + '\n' + cls.__name__ + '\n' +
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000488 self.put(memo_len))
489
490 memo[d] = (memo_len, object)
491
492 try:
493 getstate = object.__getstate__
494 except AttributeError:
495 stuff = object.__dict__
496 else:
497 stuff = getstate()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000498 _keep_alive(stuff, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000499 save(stuff)
500 write(BUILD)
501 dispatch[InstanceType] = save_inst
502
503 def save_global(self, object, name = None):
504 write = self.write
505 memo = self.memo
506
Tim Petersc32d8242001-04-10 02:48:53 +0000507 if name is None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000508 name = object.__name__
509
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000510 try:
511 module = object.__module__
512 except AttributeError:
513 module = whichmodule(object, name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000514
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000515 try:
516 __import__(module)
517 mod = sys.modules[module]
518 klass = getattr(mod, name)
519 except (ImportError, KeyError, AttributeError):
520 raise PicklingError(
521 "Can't pickle %r: it's not found as %s.%s" %
522 (object, module, name))
523 else:
524 if klass is not object:
525 raise PicklingError(
526 "Can't pickle %r: it's not the same object as %s.%s" %
527 (object, module, name))
528
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000529 memo_len = len(memo)
530 write(GLOBAL + module + '\n' + name + '\n' +
531 self.put(memo_len))
532 memo[id(object)] = (memo_len, object)
533 dispatch[ClassType] = save_global
534 dispatch[FunctionType] = save_global
535 dispatch[BuiltinFunctionType] = save_global
Tim Peters6d6c1a32001-08-02 04:15:00 +0000536 dispatch[TypeType] = save_global
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000537
Guido van Rossuma48061a1995-01-10 00:31:14 +0000538
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000539def _keep_alive(x, memo):
540 """Keeps a reference to the object x in the memo.
541
542 Because we remember objects by their id, we have
543 to assure that possibly temporary objects are kept
544 alive by referencing them.
545 We store a reference at the id of the memo, which should
546 normally not be used unless someone tries to deepcopy
547 the memo itself...
548 """
549 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000550 memo[id(memo)].append(x)
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000551 except KeyError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000552 # aha, this is the first one :-)
553 memo[id(memo)]=[x]
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000554
555
Guido van Rossuma48061a1995-01-10 00:31:14 +0000556classmap = {}
557
Guido van Rossum4fb5b281997-09-12 20:07:24 +0000558# This is no longer used to find classes, but still for functions
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000559def whichmodule(cls, clsname):
560 """Figure out the module in which a class occurs.
Guido van Rossuma48061a1995-01-10 00:31:14 +0000561
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000562 Search sys.modules for the module.
563 Cache in classmap.
564 Return a module name.
565 If the class cannot be found, return __main__.
566 """
567 if classmap.has_key(cls):
568 return classmap[cls]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000569
570 for name, module in sys.modules.items():
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000571 if name != '__main__' and \
572 hasattr(module, clsname) and \
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000573 getattr(module, clsname) is cls:
574 break
575 else:
576 name = '__main__'
577 classmap[cls] = name
578 return name
Guido van Rossuma48061a1995-01-10 00:31:14 +0000579
580
581class Unpickler:
582
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000583 def __init__(self, file):
584 self.readline = file.readline
585 self.read = file.read
586 self.memo = {}
Guido van Rossuma48061a1995-01-10 00:31:14 +0000587
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000588 def load(self):
Jeremy Hylton20747fa2001-11-09 16:15:04 +0000589 self.mark = object() # any new unique object
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000590 self.stack = []
591 self.append = self.stack.append
592 read = self.read
593 dispatch = self.dispatch
594 try:
595 while 1:
596 key = read(1)
597 dispatch[key](self)
Guido van Rossumff871742000-12-13 18:11:56 +0000598 except _Stop, stopinst:
599 return stopinst.value
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000600
601 def marker(self):
602 stack = self.stack
603 mark = self.mark
604 k = len(stack)-1
605 while stack[k] is not mark: k = k-1
606 return k
607
608 dispatch = {}
609
610 def load_eof(self):
611 raise EOFError
612 dispatch[''] = load_eof
613
614 def load_persid(self):
615 pid = self.readline()[:-1]
616 self.append(self.persistent_load(pid))
617 dispatch[PERSID] = load_persid
618
619 def load_binpersid(self):
620 stack = self.stack
Tim Peters2344fae2001-01-15 00:50:52 +0000621
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000622 pid = stack[-1]
623 del stack[-1]
624
625 self.append(self.persistent_load(pid))
626 dispatch[BINPERSID] = load_binpersid
627
628 def load_none(self):
629 self.append(None)
630 dispatch[NONE] = load_none
631
632 def load_int(self):
Tim Peters19ef62d2001-08-28 22:21:18 +0000633 data = self.readline()
634 try:
635 self.append(int(data))
636 except ValueError:
637 self.append(long(data))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000638 dispatch[INT] = load_int
639
640 def load_binint(self):
641 self.append(mloads('i' + self.read(4)))
642 dispatch[BININT] = load_binint
643
644 def load_binint1(self):
645 self.append(mloads('i' + self.read(1) + '\000\000\000'))
646 dispatch[BININT1] = load_binint1
647
648 def load_binint2(self):
649 self.append(mloads('i' + self.read(2) + '\000\000'))
650 dispatch[BININT2] = load_binint2
Tim Peters2344fae2001-01-15 00:50:52 +0000651
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000652 def load_long(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000653 self.append(long(self.readline()[:-1], 0))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000654 dispatch[LONG] = load_long
655
656 def load_float(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000657 self.append(float(self.readline()[:-1]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000658 dispatch[FLOAT] = load_float
659
Guido van Rossumd3703791998-10-22 20:15:36 +0000660 def load_binfloat(self, unpack=struct.unpack):
661 self.append(unpack('>d', self.read(8))[0])
662 dispatch[BINFLOAT] = load_binfloat
663
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000664 def load_string(self):
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000665 rep = self.readline()[:-1]
666 if not self._is_string_secure(rep):
667 raise ValueError, "insecure string pickle"
668 self.append(eval(rep,
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000669 {'__builtins__': {}})) # Let's be careful
670 dispatch[STRING] = load_string
671
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000672 def _is_string_secure(self, s):
673 """Return true if s contains a string that is safe to eval
674
675 The definition of secure string is based on the implementation
676 in cPickle. s is secure as long as it only contains a quoted
677 string and optional trailing whitespace.
678 """
679 q = s[0]
680 if q not in ("'", '"'):
681 return 0
682 # find the closing quote
683 offset = 1
684 i = None
685 while 1:
686 try:
687 i = s.index(q, offset)
688 except ValueError:
689 # if there is an error the first time, there is no
690 # close quote
691 if offset == 1:
692 return 0
693 if s[i-1] != '\\':
694 break
695 # check to see if this one is escaped
696 nslash = 0
697 j = i - 1
698 while j >= offset and s[j] == '\\':
699 j = j - 1
700 nslash = nslash + 1
701 if nslash % 2 == 0:
702 break
703 offset = i + 1
704 for c in s[i+1:]:
705 if ord(c) > 32:
706 return 0
707 return 1
708
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000709 def load_binstring(self):
710 len = mloads('i' + self.read(4))
711 self.append(self.read(len))
712 dispatch[BINSTRING] = load_binstring
713
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000714 def load_unicode(self):
715 self.append(unicode(self.readline()[:-1],'raw-unicode-escape'))
716 dispatch[UNICODE] = load_unicode
717
718 def load_binunicode(self):
719 len = mloads('i' + self.read(4))
720 self.append(unicode(self.read(len),'utf-8'))
721 dispatch[BINUNICODE] = load_binunicode
722
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000723 def load_short_binstring(self):
724 len = mloads('i' + self.read(1) + '\000\000\000')
725 self.append(self.read(len))
726 dispatch[SHORT_BINSTRING] = load_short_binstring
727
728 def load_tuple(self):
729 k = self.marker()
730 self.stack[k:] = [tuple(self.stack[k+1:])]
731 dispatch[TUPLE] = load_tuple
732
733 def load_empty_tuple(self):
734 self.stack.append(())
735 dispatch[EMPTY_TUPLE] = load_empty_tuple
736
737 def load_empty_list(self):
738 self.stack.append([])
739 dispatch[EMPTY_LIST] = load_empty_list
740
741 def load_empty_dictionary(self):
742 self.stack.append({})
743 dispatch[EMPTY_DICT] = load_empty_dictionary
744
745 def load_list(self):
746 k = self.marker()
747 self.stack[k:] = [self.stack[k+1:]]
748 dispatch[LIST] = load_list
749
750 def load_dict(self):
751 k = self.marker()
752 d = {}
753 items = self.stack[k+1:]
754 for i in range(0, len(items), 2):
755 key = items[i]
756 value = items[i+1]
757 d[key] = value
758 self.stack[k:] = [d]
759 dispatch[DICT] = load_dict
760
761 def load_inst(self):
762 k = self.marker()
763 args = tuple(self.stack[k+1:])
764 del self.stack[k:]
765 module = self.readline()[:-1]
766 name = self.readline()[:-1]
767 klass = self.find_class(module, name)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000768 instantiated = 0
769 if (not args and type(klass) is ClassType and
770 not hasattr(klass, "__getinitargs__")):
771 try:
772 value = _EmptyClass()
773 value.__class__ = klass
Guido van Rossumb19e2a31998-04-13 18:08:45 +0000774 instantiated = 1
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000775 except RuntimeError:
776 # In restricted execution, assignment to inst.__class__ is
777 # prohibited
778 pass
779 if not instantiated:
Guido van Rossum743d17e1998-09-15 20:25:57 +0000780 try:
Barry Warsawbf4d9592001-11-15 23:42:58 +0000781 if not hasattr(klass, '__safe_for_unpickling__'):
782 raise UnpicklingError('%s is not safe for unpickling' %
783 klass)
Guido van Rossum743d17e1998-09-15 20:25:57 +0000784 value = apply(klass, args)
785 except TypeError, err:
786 raise TypeError, "in constructor for %s: %s" % (
787 klass.__name__, str(err)), sys.exc_info()[2]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000788 self.append(value)
789 dispatch[INST] = load_inst
790
791 def load_obj(self):
792 stack = self.stack
793 k = self.marker()
794 klass = stack[k + 1]
795 del stack[k + 1]
Tim Peters2344fae2001-01-15 00:50:52 +0000796 args = tuple(stack[k + 1:])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000797 del stack[k:]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000798 instantiated = 0
799 if (not args and type(klass) is ClassType and
800 not hasattr(klass, "__getinitargs__")):
801 try:
802 value = _EmptyClass()
803 value.__class__ = klass
804 instantiated = 1
805 except RuntimeError:
806 # In restricted execution, assignment to inst.__class__ is
807 # prohibited
808 pass
809 if not instantiated:
810 value = apply(klass, args)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000811 self.append(value)
Tim Peters2344fae2001-01-15 00:50:52 +0000812 dispatch[OBJ] = load_obj
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000813
814 def load_global(self):
815 module = self.readline()[:-1]
816 name = self.readline()[:-1]
817 klass = self.find_class(module, name)
818 self.append(klass)
819 dispatch[GLOBAL] = load_global
820
821 def find_class(self, module, name):
Barry Warsawbf4d9592001-11-15 23:42:58 +0000822 __import__(module)
823 mod = sys.modules[module]
824 klass = getattr(mod, name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000825 return klass
826
827 def load_reduce(self):
828 stack = self.stack
829
830 callable = stack[-2]
831 arg_tup = stack[-1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000832 del stack[-2:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000833
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000834 if type(callable) is not ClassType:
835 if not safe_constructors.has_key(callable):
836 try:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000837 safe = callable.__safe_for_unpickling__
838 except AttributeError:
839 safe = None
Guido van Rossuma48061a1995-01-10 00:31:14 +0000840
Tim Petersc32d8242001-04-10 02:48:53 +0000841 if not safe:
Tim Peters2344fae2001-01-15 00:50:52 +0000842 raise UnpicklingError, "%s is not safe for " \
843 "unpickling" % callable
Guido van Rossuma48061a1995-01-10 00:31:14 +0000844
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000845 if arg_tup is None:
846 value = callable.__basicnew__()
847 else:
848 value = apply(callable, arg_tup)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000849 self.append(value)
850 dispatch[REDUCE] = load_reduce
Guido van Rossuma48061a1995-01-10 00:31:14 +0000851
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000852 def load_pop(self):
853 del self.stack[-1]
854 dispatch[POP] = load_pop
Guido van Rossum7b5430f1995-03-04 22:25:21 +0000855
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000856 def load_pop_mark(self):
857 k = self.marker()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000858 del self.stack[k:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000859 dispatch[POP_MARK] = load_pop_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +0000860
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000861 def load_dup(self):
Guido van Rossumb1062fc1998-03-31 17:00:46 +0000862 self.append(self.stack[-1])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000863 dispatch[DUP] = load_dup
Guido van Rossuma48061a1995-01-10 00:31:14 +0000864
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000865 def load_get(self):
866 self.append(self.memo[self.readline()[:-1]])
867 dispatch[GET] = load_get
Guido van Rossum78536471996-04-12 13:36:27 +0000868
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000869 def load_binget(self):
870 i = mloads('i' + self.read(1) + '\000\000\000')
871 self.append(self.memo[`i`])
872 dispatch[BINGET] = load_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000873
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000874 def load_long_binget(self):
875 i = mloads('i' + self.read(4))
876 self.append(self.memo[`i`])
877 dispatch[LONG_BINGET] = load_long_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000878
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000879 def load_put(self):
880 self.memo[self.readline()[:-1]] = self.stack[-1]
881 dispatch[PUT] = load_put
Guido van Rossuma48061a1995-01-10 00:31:14 +0000882
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000883 def load_binput(self):
884 i = mloads('i' + self.read(1) + '\000\000\000')
885 self.memo[`i`] = self.stack[-1]
886 dispatch[BINPUT] = load_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000887
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000888 def load_long_binput(self):
889 i = mloads('i' + self.read(4))
890 self.memo[`i`] = self.stack[-1]
891 dispatch[LONG_BINPUT] = load_long_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000892
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000893 def load_append(self):
894 stack = self.stack
895 value = stack[-1]
896 del stack[-1]
897 list = stack[-1]
898 list.append(value)
899 dispatch[APPEND] = load_append
Guido van Rossuma48061a1995-01-10 00:31:14 +0000900
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000901 def load_appends(self):
902 stack = self.stack
903 mark = self.marker()
904 list = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000905 for i in range(mark + 1, len(stack)):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000906 list.append(stack[i])
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000907
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000908 del stack[mark:]
909 dispatch[APPENDS] = load_appends
Tim Peters2344fae2001-01-15 00:50:52 +0000910
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000911 def load_setitem(self):
912 stack = self.stack
913 value = stack[-1]
914 key = stack[-2]
915 del stack[-2:]
916 dict = stack[-1]
917 dict[key] = value
918 dispatch[SETITEM] = load_setitem
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000919
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000920 def load_setitems(self):
921 stack = self.stack
922 mark = self.marker()
923 dict = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000924 for i in range(mark + 1, len(stack), 2):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000925 dict[stack[i]] = stack[i + 1]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000926
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000927 del stack[mark:]
928 dispatch[SETITEMS] = load_setitems
Guido van Rossuma48061a1995-01-10 00:31:14 +0000929
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000930 def load_build(self):
931 stack = self.stack
932 value = stack[-1]
933 del stack[-1]
934 inst = stack[-1]
935 try:
936 setstate = inst.__setstate__
937 except AttributeError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000938 try:
939 inst.__dict__.update(value)
940 except RuntimeError:
941 # XXX In restricted execution, the instance's __dict__ is not
942 # accessible. Use the old way of unpickling the instance
943 # variables. This is a semantic different when unpickling in
944 # restricted vs. unrestricted modes.
945 for k, v in value.items():
946 setattr(inst, k, v)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000947 else:
948 setstate(value)
949 dispatch[BUILD] = load_build
Guido van Rossuma48061a1995-01-10 00:31:14 +0000950
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000951 def load_mark(self):
952 self.append(self.mark)
953 dispatch[MARK] = load_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +0000954
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000955 def load_stop(self):
956 value = self.stack[-1]
957 del self.stack[-1]
Guido van Rossumff871742000-12-13 18:11:56 +0000958 raise _Stop(value)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000959 dispatch[STOP] = load_stop
Guido van Rossuma48061a1995-01-10 00:31:14 +0000960
Guido van Rossume467be61997-12-05 19:42:42 +0000961# Helper class for load_inst/load_obj
962
963class _EmptyClass:
964 pass
Guido van Rossuma48061a1995-01-10 00:31:14 +0000965
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000966# Shorthands
967
Jeremy Hyltonabe2c622001-10-15 21:29:28 +0000968try:
969 from cStringIO import StringIO
970except ImportError:
971 from StringIO import StringIO
Guido van Rossumc7c5e691996-07-22 22:26:07 +0000972
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000973def dump(object, file, bin = 0):
974 Pickler(file, bin).dump(object)
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000975
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000976def dumps(object, bin = 0):
977 file = StringIO()
978 Pickler(file, bin).dump(object)
979 return file.getvalue()
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000980
981def load(file):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000982 return Unpickler(file).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000983
984def loads(str):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000985 file = StringIO(str)
986 return Unpickler(file).load()