blob: 6a162a98653d4db92c520698e3cf74e92a313e6d [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 Rossume2763392002-04-05 19:30:08 +0000104TRUE = 'I01\n'
105FALSE = 'I00\n'
Guido van Rossum77f6a652002-04-03 22:41:51 +0000106
Guido van Rossuma48061a1995-01-10 00:31:14 +0000107
Skip Montanaro23bafc62001-02-18 03:10:09 +0000108__all__.extend([x for x in dir() if re.match("[A-Z][A-Z0-9_]+$",x)])
Neal Norwitzd5ba4ae2002-02-11 18:12:06 +0000109del x
Skip Montanaro23bafc62001-02-18 03:10:09 +0000110
Guido van Rossuma48061a1995-01-10 00:31:14 +0000111class Pickler:
112
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000113 def __init__(self, file, bin = 0):
114 self.write = file.write
115 self.memo = {}
116 self.bin = bin
Guido van Rossuma48061a1995-01-10 00:31:14 +0000117
Fred Drake7f781c92002-05-01 20:33:53 +0000118 def clear_memo(self):
119 self.memo.clear()
120
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000121 def dump(self, object):
122 self.save(object)
123 self.write(STOP)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000124
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000125 def put(self, i):
Tim Petersc32d8242001-04-10 02:48:53 +0000126 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000127 s = mdumps(i)[1:]
Tim Petersc32d8242001-04-10 02:48:53 +0000128 if i < 256:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000129 return BINPUT + s[0]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000130
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000131 return LONG_BINPUT + s
Guido van Rossuma48061a1995-01-10 00:31:14 +0000132
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000133 return PUT + `i` + '\n'
Guido van Rossuma48061a1995-01-10 00:31:14 +0000134
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000135 def get(self, i):
Tim Petersc32d8242001-04-10 02:48:53 +0000136 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000137 s = mdumps(i)[1:]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000138
Tim Petersc32d8242001-04-10 02:48:53 +0000139 if i < 256:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000140 return BINGET + s[0]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000141
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000142 return LONG_BINGET + s
Guido van Rossuma48061a1995-01-10 00:31:14 +0000143
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000144 return GET + `i` + '\n'
Tim Peters2344fae2001-01-15 00:50:52 +0000145
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000146 def save(self, object, pers_save = 0):
147 memo = self.memo
Guido van Rossuma48061a1995-01-10 00:31:14 +0000148
Tim Petersc32d8242001-04-10 02:48:53 +0000149 if not pers_save:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000150 pid = self.persistent_id(object)
Tim Petersc32d8242001-04-10 02:48:53 +0000151 if pid is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000152 self.save_pers(pid)
153 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000154
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000155 d = id(object)
Tim Peters2344fae2001-01-15 00:50:52 +0000156
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000157 t = type(object)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000158
Tim Petersc32d8242001-04-10 02:48:53 +0000159 if (t is TupleType) and (len(object) == 0):
160 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000161 self.save_empty_tuple(object)
162 else:
163 self.save_tuple(object)
164 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000165
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000166 if memo.has_key(d):
167 self.write(self.get(memo[d][0]))
168 return
169
170 try:
171 f = self.dispatch[t]
172 except KeyError:
Guido van Rossum85ee4912002-03-26 00:51:56 +0000173 try:
174 issc = issubclass(t, TypeType)
175 except TypeError: # t is not a class
176 issc = 0
177 if issc:
Guido van Rossumf048a8f2001-12-19 16:55:02 +0000178 self.save_global(object)
179 return
180
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000181 pid = self.inst_persistent_id(object)
182 if pid is not None:
183 self.save_pers(pid)
184 return
185
186 try:
187 reduce = dispatch_table[t]
188 except KeyError:
189 try:
190 reduce = object.__reduce__
191 except AttributeError:
192 raise PicklingError, \
Guido van Rossum08a92cb1999-10-10 21:14:25 +0000193 "can't pickle %s object: %s" % (`t.__name__`,
194 `object`)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000195 else:
196 tup = reduce()
197 else:
198 tup = reduce(object)
199
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000200 if type(tup) is StringType:
201 self.save_global(object, tup)
202 return
Guido van Rossumd1f49841997-12-10 23:40:18 +0000203
Tim Petersc32d8242001-04-10 02:48:53 +0000204 if type(tup) is not TupleType:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000205 raise PicklingError, "Value returned by %s must be a " \
206 "tuple" % reduce
207
208 l = len(tup)
Tim Peters2344fae2001-01-15 00:50:52 +0000209
Tim Petersc32d8242001-04-10 02:48:53 +0000210 if (l != 2) and (l != 3):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000211 raise PicklingError, "tuple returned by %s must contain " \
212 "only two or three elements" % reduce
213
214 callable = tup[0]
215 arg_tup = tup[1]
Tim Peters2344fae2001-01-15 00:50:52 +0000216
Tim Petersc32d8242001-04-10 02:48:53 +0000217 if l > 2:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000218 state = tup[2]
219 else:
220 state = None
221
Guido van Rossumd1f49841997-12-10 23:40:18 +0000222 if type(arg_tup) is not TupleType and arg_tup is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000223 raise PicklingError, "Second element of tuple returned " \
224 "by %s must be a tuple" % reduce
225
Tim Peters2344fae2001-01-15 00:50:52 +0000226 self.save_reduce(callable, arg_tup, state)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000227 memo_len = len(memo)
228 self.write(self.put(memo_len))
229 memo[d] = (memo_len, object)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000230 return
231
232 f(self, object)
233
234 def persistent_id(self, object):
235 return None
236
237 def inst_persistent_id(self, object):
238 return None
239
240 def save_pers(self, pid):
Tim Petersc32d8242001-04-10 02:48:53 +0000241 if not self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000242 self.write(PERSID + str(pid) + '\n')
243 else:
244 self.save(pid, 1)
245 self.write(BINPERSID)
246
247 def save_reduce(self, callable, arg_tup, state = None):
248 write = self.write
249 save = self.save
250
251 save(callable)
252 save(arg_tup)
253 write(REDUCE)
Tim Peters2344fae2001-01-15 00:50:52 +0000254
Tim Petersc32d8242001-04-10 02:48:53 +0000255 if state is not None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000256 save(state)
257 write(BUILD)
258
259 dispatch = {}
260
261 def save_none(self, object):
262 self.write(NONE)
263 dispatch[NoneType] = save_none
264
Guido van Rossum77f6a652002-04-03 22:41:51 +0000265 def save_bool(self, object):
266 if object:
267 self.write(TRUE)
268 else:
269 self.write(FALSE)
270 dispatch[bool] = save_bool
271
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000272 def save_int(self, object):
Tim Petersc32d8242001-04-10 02:48:53 +0000273 if self.bin:
Tim Peters44714002001-04-10 05:02:52 +0000274 # If the int is small enough to fit in a signed 4-byte 2's-comp
275 # format, we can store it more efficiently than the general
276 # case.
277 high_bits = object >> 31 # note that Python shift sign-extends
278 if high_bits == 0 or high_bits == -1:
279 # All high bits are copies of bit 2**31, so the value
280 # fits in a 4-byte signed int.
281 i = mdumps(object)[1:]
282 assert len(i) == 4
283 if i[-2:] == '\000\000': # fits in 2-byte unsigned int
284 if i[-3] == '\000': # fits in 1-byte unsigned int
285 self.write(BININT1 + i[0])
286 else:
287 self.write(BININT2 + i[:2])
288 else:
289 self.write(BININT + i)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000290 return
Tim Peters44714002001-04-10 05:02:52 +0000291 # Text pickle, or int too big to fit in signed 4-byte format.
292 self.write(INT + `object` + '\n')
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000293 dispatch[IntType] = save_int
294
295 def save_long(self, object):
296 self.write(LONG + `object` + '\n')
297 dispatch[LongType] = save_long
298
Guido van Rossumd3703791998-10-22 20:15:36 +0000299 def save_float(self, object, pack=struct.pack):
300 if self.bin:
301 self.write(BINFLOAT + pack('>d', object))
302 else:
303 self.write(FLOAT + `object` + '\n')
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000304 dispatch[FloatType] = save_float
305
306 def save_string(self, object):
307 d = id(object)
308 memo = self.memo
309
Tim Petersc32d8242001-04-10 02:48:53 +0000310 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000311 l = len(object)
312 s = mdumps(l)[1:]
Tim Petersc32d8242001-04-10 02:48:53 +0000313 if l < 256:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000314 self.write(SHORT_BINSTRING + s[0] + object)
315 else:
316 self.write(BINSTRING + s + object)
317 else:
318 self.write(STRING + `object` + '\n')
319
320 memo_len = len(memo)
321 self.write(self.put(memo_len))
322 memo[d] = (memo_len, object)
323 dispatch[StringType] = save_string
324
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000325 def save_unicode(self, object):
326 d = id(object)
327 memo = self.memo
328
Tim Petersc32d8242001-04-10 02:48:53 +0000329 if self.bin:
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000330 encoding = object.encode('utf-8')
331 l = len(encoding)
332 s = mdumps(l)[1:]
333 self.write(BINUNICODE + s + encoding)
334 else:
Guido van Rossumdbb718f2001-09-21 19:22:34 +0000335 object = object.replace("\\", "\\u005c")
336 object = object.replace("\n", "\\u000a")
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000337 self.write(UNICODE + object.encode('raw-unicode-escape') + '\n')
338
339 memo_len = len(memo)
340 self.write(self.put(memo_len))
341 memo[d] = (memo_len, object)
342 dispatch[UnicodeType] = save_unicode
343
Guido van Rossum31584cb2001-01-22 14:53:29 +0000344 if StringType == UnicodeType:
345 # This is true for Jython
346 def save_string(self, object):
347 d = id(object)
348 memo = self.memo
349 unicode = object.isunicode()
350
Tim Petersc32d8242001-04-10 02:48:53 +0000351 if self.bin:
Guido van Rossum31584cb2001-01-22 14:53:29 +0000352 if unicode:
353 object = object.encode("utf-8")
354 l = len(object)
355 s = mdumps(l)[1:]
Tim Petersc32d8242001-04-10 02:48:53 +0000356 if l < 256 and not unicode:
Guido van Rossum31584cb2001-01-22 14:53:29 +0000357 self.write(SHORT_BINSTRING + s[0] + object)
358 else:
359 if unicode:
360 self.write(BINUNICODE + s + object)
361 else:
362 self.write(BINSTRING + s + object)
363 else:
Tim Peters658cba62001-02-09 20:06:00 +0000364 if unicode:
Guido van Rossumdbb718f2001-09-21 19:22:34 +0000365 object = object.replace("\\", "\\u005c")
366 object = object.replace("\n", "\\u000a")
Guido van Rossum31584cb2001-01-22 14:53:29 +0000367 object = object.encode('raw-unicode-escape')
368 self.write(UNICODE + object + '\n')
369 else:
370 self.write(STRING + `object` + '\n')
371
372 memo_len = len(memo)
373 self.write(self.put(memo_len))
374 memo[d] = (memo_len, object)
375 dispatch[StringType] = save_string
Tim Peters658cba62001-02-09 20:06:00 +0000376
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000377 def save_tuple(self, object):
378
379 write = self.write
380 save = self.save
381 memo = self.memo
382
383 d = id(object)
384
385 write(MARK)
386
387 for element in object:
388 save(element)
389
Tim Petersc32d8242001-04-10 02:48:53 +0000390 if len(object) and memo.has_key(d):
391 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000392 write(POP_MARK + self.get(memo[d][0]))
393 return
Tim Peters2344fae2001-01-15 00:50:52 +0000394
Guido van Rossum599174f1998-03-31 16:30:28 +0000395 write(POP * (len(object) + 1) + self.get(memo[d][0]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000396 return
397
398 memo_len = len(memo)
399 self.write(TUPLE + self.put(memo_len))
400 memo[d] = (memo_len, object)
401 dispatch[TupleType] = save_tuple
402
403 def save_empty_tuple(self, object):
404 self.write(EMPTY_TUPLE)
405
406 def save_list(self, object):
407 d = id(object)
408
409 write = self.write
410 save = self.save
411 memo = self.memo
412
Tim Petersc32d8242001-04-10 02:48:53 +0000413 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000414 write(EMPTY_LIST)
415 else:
416 write(MARK + LIST)
417
418 memo_len = len(memo)
419 write(self.put(memo_len))
420 memo[d] = (memo_len, object)
421
422 using_appends = (self.bin and (len(object) > 1))
423
Tim Petersc32d8242001-04-10 02:48:53 +0000424 if using_appends:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000425 write(MARK)
426
427 for element in object:
428 save(element)
Tim Peters2344fae2001-01-15 00:50:52 +0000429
Tim Petersc32d8242001-04-10 02:48:53 +0000430 if not using_appends:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000431 write(APPEND)
432
Tim Petersc32d8242001-04-10 02:48:53 +0000433 if using_appends:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000434 write(APPENDS)
435 dispatch[ListType] = save_list
436
437 def save_dict(self, object):
438 d = id(object)
439
440 write = self.write
441 save = self.save
442 memo = self.memo
443
Tim Petersc32d8242001-04-10 02:48:53 +0000444 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000445 write(EMPTY_DICT)
446 else:
447 write(MARK + DICT)
448
449 memo_len = len(memo)
450 self.write(self.put(memo_len))
451 memo[d] = (memo_len, object)
452
453 using_setitems = (self.bin and (len(object) > 1))
454
Tim Petersc32d8242001-04-10 02:48:53 +0000455 if using_setitems:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000456 write(MARK)
457
458 items = object.items()
459 for key, value in items:
460 save(key)
461 save(value)
462
Tim Petersc32d8242001-04-10 02:48:53 +0000463 if not using_setitems:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000464 write(SETITEM)
465
Tim Petersc32d8242001-04-10 02:48:53 +0000466 if using_setitems:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000467 write(SETITEMS)
468
469 dispatch[DictionaryType] = save_dict
Jeremy Hylton2b9d0291998-05-27 22:38:22 +0000470 if not PyStringMap is None:
471 dispatch[PyStringMap] = save_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000472
473 def save_inst(self, object):
474 d = id(object)
475 cls = object.__class__
476
477 memo = self.memo
478 write = self.write
479 save = self.save
480
481 if hasattr(object, '__getinitargs__'):
482 args = object.__getinitargs__()
483 len(args) # XXX Assert it's a sequence
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000484 _keep_alive(args, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000485 else:
486 args = ()
487
488 write(MARK)
489
Tim Petersc32d8242001-04-10 02:48:53 +0000490 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000491 save(cls)
492
493 for arg in args:
494 save(arg)
495
496 memo_len = len(memo)
Tim Petersc32d8242001-04-10 02:48:53 +0000497 if self.bin:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000498 write(OBJ + self.put(memo_len))
499 else:
Guido van Rossum4fb5b281997-09-12 20:07:24 +0000500 write(INST + cls.__module__ + '\n' + cls.__name__ + '\n' +
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000501 self.put(memo_len))
502
503 memo[d] = (memo_len, object)
504
505 try:
506 getstate = object.__getstate__
507 except AttributeError:
508 stuff = object.__dict__
509 else:
510 stuff = getstate()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000511 _keep_alive(stuff, memo)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000512 save(stuff)
513 write(BUILD)
514 dispatch[InstanceType] = save_inst
515
516 def save_global(self, object, name = None):
517 write = self.write
518 memo = self.memo
519
Tim Petersc32d8242001-04-10 02:48:53 +0000520 if name is None:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000521 name = object.__name__
522
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000523 try:
524 module = object.__module__
525 except AttributeError:
526 module = whichmodule(object, name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000527
Guido van Rossumb0a98e92001-08-17 18:49:52 +0000528 try:
529 __import__(module)
530 mod = sys.modules[module]
531 klass = getattr(mod, name)
532 except (ImportError, KeyError, AttributeError):
533 raise PicklingError(
534 "Can't pickle %r: it's not found as %s.%s" %
535 (object, module, name))
536 else:
537 if klass is not object:
538 raise PicklingError(
539 "Can't pickle %r: it's not the same object as %s.%s" %
540 (object, module, name))
541
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000542 memo_len = len(memo)
543 write(GLOBAL + module + '\n' + name + '\n' +
544 self.put(memo_len))
545 memo[id(object)] = (memo_len, object)
546 dispatch[ClassType] = save_global
547 dispatch[FunctionType] = save_global
548 dispatch[BuiltinFunctionType] = save_global
Tim Peters6d6c1a32001-08-02 04:15:00 +0000549 dispatch[TypeType] = save_global
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000550
Guido van Rossuma48061a1995-01-10 00:31:14 +0000551
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000552def _keep_alive(x, memo):
553 """Keeps a reference to the object x in the memo.
554
555 Because we remember objects by their id, we have
556 to assure that possibly temporary objects are kept
557 alive by referencing them.
558 We store a reference at the id of the memo, which should
559 normally not be used unless someone tries to deepcopy
560 the memo itself...
561 """
562 try:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000563 memo[id(memo)].append(x)
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000564 except KeyError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000565 # aha, this is the first one :-)
566 memo[id(memo)]=[x]
Guido van Rossum5ed5c4c1997-09-03 00:23:54 +0000567
568
Guido van Rossuma48061a1995-01-10 00:31:14 +0000569classmap = {}
570
Guido van Rossum4fb5b281997-09-12 20:07:24 +0000571# This is no longer used to find classes, but still for functions
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000572def whichmodule(cls, clsname):
573 """Figure out the module in which a class occurs.
Guido van Rossuma48061a1995-01-10 00:31:14 +0000574
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000575 Search sys.modules for the module.
576 Cache in classmap.
577 Return a module name.
578 If the class cannot be found, return __main__.
579 """
580 if classmap.has_key(cls):
581 return classmap[cls]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000582
583 for name, module in sys.modules.items():
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000584 if name != '__main__' and \
585 hasattr(module, clsname) and \
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000586 getattr(module, clsname) is cls:
587 break
588 else:
589 name = '__main__'
590 classmap[cls] = name
591 return name
Guido van Rossuma48061a1995-01-10 00:31:14 +0000592
593
594class Unpickler:
595
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000596 def __init__(self, file):
597 self.readline = file.readline
598 self.read = file.read
599 self.memo = {}
Guido van Rossuma48061a1995-01-10 00:31:14 +0000600
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000601 def load(self):
Jeremy Hylton20747fa2001-11-09 16:15:04 +0000602 self.mark = object() # any new unique object
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000603 self.stack = []
604 self.append = self.stack.append
605 read = self.read
606 dispatch = self.dispatch
607 try:
608 while 1:
609 key = read(1)
610 dispatch[key](self)
Guido van Rossumff871742000-12-13 18:11:56 +0000611 except _Stop, stopinst:
612 return stopinst.value
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000613
614 def marker(self):
615 stack = self.stack
616 mark = self.mark
617 k = len(stack)-1
618 while stack[k] is not mark: k = k-1
619 return k
620
621 dispatch = {}
622
623 def load_eof(self):
624 raise EOFError
625 dispatch[''] = load_eof
626
627 def load_persid(self):
628 pid = self.readline()[:-1]
629 self.append(self.persistent_load(pid))
630 dispatch[PERSID] = load_persid
631
632 def load_binpersid(self):
633 stack = self.stack
Tim Peters2344fae2001-01-15 00:50:52 +0000634
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000635 pid = stack[-1]
636 del stack[-1]
637
638 self.append(self.persistent_load(pid))
639 dispatch[BINPERSID] = load_binpersid
640
641 def load_none(self):
642 self.append(None)
643 dispatch[NONE] = load_none
644
645 def load_int(self):
Tim Peters19ef62d2001-08-28 22:21:18 +0000646 data = self.readline()
Guido van Rossume2763392002-04-05 19:30:08 +0000647 if data == FALSE[1:]:
648 val = False
649 elif data == TRUE[1:]:
650 val = True
651 else:
652 try:
653 val = int(data)
654 except ValueError:
655 val = long(data)
656 self.append(val)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000657 dispatch[INT] = load_int
658
659 def load_binint(self):
660 self.append(mloads('i' + self.read(4)))
661 dispatch[BININT] = load_binint
662
663 def load_binint1(self):
664 self.append(mloads('i' + self.read(1) + '\000\000\000'))
665 dispatch[BININT1] = load_binint1
666
667 def load_binint2(self):
668 self.append(mloads('i' + self.read(2) + '\000\000'))
669 dispatch[BININT2] = load_binint2
Tim Peters2344fae2001-01-15 00:50:52 +0000670
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000671 def load_long(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000672 self.append(long(self.readline()[:-1], 0))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000673 dispatch[LONG] = load_long
674
675 def load_float(self):
Guido van Rossumff871742000-12-13 18:11:56 +0000676 self.append(float(self.readline()[:-1]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000677 dispatch[FLOAT] = load_float
678
Guido van Rossumd3703791998-10-22 20:15:36 +0000679 def load_binfloat(self, unpack=struct.unpack):
680 self.append(unpack('>d', self.read(8))[0])
681 dispatch[BINFLOAT] = load_binfloat
682
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000683 def load_string(self):
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000684 rep = self.readline()[:-1]
685 if not self._is_string_secure(rep):
686 raise ValueError, "insecure string pickle"
687 self.append(eval(rep,
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000688 {'__builtins__': {}})) # Let's be careful
689 dispatch[STRING] = load_string
690
Jeremy Hyltonbe467e52000-09-15 15:14:51 +0000691 def _is_string_secure(self, s):
692 """Return true if s contains a string that is safe to eval
693
694 The definition of secure string is based on the implementation
695 in cPickle. s is secure as long as it only contains a quoted
696 string and optional trailing whitespace.
697 """
698 q = s[0]
699 if q not in ("'", '"'):
700 return 0
701 # find the closing quote
702 offset = 1
703 i = None
704 while 1:
705 try:
706 i = s.index(q, offset)
707 except ValueError:
708 # if there is an error the first time, there is no
709 # close quote
710 if offset == 1:
711 return 0
712 if s[i-1] != '\\':
713 break
714 # check to see if this one is escaped
715 nslash = 0
716 j = i - 1
717 while j >= offset and s[j] == '\\':
718 j = j - 1
719 nslash = nslash + 1
720 if nslash % 2 == 0:
721 break
722 offset = i + 1
723 for c in s[i+1:]:
724 if ord(c) > 32:
725 return 0
726 return 1
727
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000728 def load_binstring(self):
729 len = mloads('i' + self.read(4))
730 self.append(self.read(len))
731 dispatch[BINSTRING] = load_binstring
732
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000733 def load_unicode(self):
734 self.append(unicode(self.readline()[:-1],'raw-unicode-escape'))
735 dispatch[UNICODE] = load_unicode
736
737 def load_binunicode(self):
738 len = mloads('i' + self.read(4))
739 self.append(unicode(self.read(len),'utf-8'))
740 dispatch[BINUNICODE] = load_binunicode
741
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000742 def load_short_binstring(self):
743 len = mloads('i' + self.read(1) + '\000\000\000')
744 self.append(self.read(len))
745 dispatch[SHORT_BINSTRING] = load_short_binstring
746
747 def load_tuple(self):
748 k = self.marker()
749 self.stack[k:] = [tuple(self.stack[k+1:])]
750 dispatch[TUPLE] = load_tuple
751
752 def load_empty_tuple(self):
753 self.stack.append(())
754 dispatch[EMPTY_TUPLE] = load_empty_tuple
755
756 def load_empty_list(self):
757 self.stack.append([])
758 dispatch[EMPTY_LIST] = load_empty_list
759
760 def load_empty_dictionary(self):
761 self.stack.append({})
762 dispatch[EMPTY_DICT] = load_empty_dictionary
763
764 def load_list(self):
765 k = self.marker()
766 self.stack[k:] = [self.stack[k+1:]]
767 dispatch[LIST] = load_list
768
769 def load_dict(self):
770 k = self.marker()
771 d = {}
772 items = self.stack[k+1:]
773 for i in range(0, len(items), 2):
774 key = items[i]
775 value = items[i+1]
776 d[key] = value
777 self.stack[k:] = [d]
778 dispatch[DICT] = load_dict
779
780 def load_inst(self):
781 k = self.marker()
782 args = tuple(self.stack[k+1:])
783 del self.stack[k:]
784 module = self.readline()[:-1]
785 name = self.readline()[:-1]
786 klass = self.find_class(module, name)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000787 instantiated = 0
788 if (not args and type(klass) is ClassType and
789 not hasattr(klass, "__getinitargs__")):
790 try:
791 value = _EmptyClass()
792 value.__class__ = klass
Guido van Rossumb19e2a31998-04-13 18:08:45 +0000793 instantiated = 1
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000794 except RuntimeError:
795 # In restricted execution, assignment to inst.__class__ is
796 # prohibited
797 pass
798 if not instantiated:
Guido van Rossum743d17e1998-09-15 20:25:57 +0000799 try:
Barry Warsawbf4d9592001-11-15 23:42:58 +0000800 if not hasattr(klass, '__safe_for_unpickling__'):
801 raise UnpicklingError('%s is not safe for unpickling' %
802 klass)
Guido van Rossum743d17e1998-09-15 20:25:57 +0000803 value = apply(klass, args)
804 except TypeError, err:
805 raise TypeError, "in constructor for %s: %s" % (
806 klass.__name__, str(err)), sys.exc_info()[2]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000807 self.append(value)
808 dispatch[INST] = load_inst
809
810 def load_obj(self):
811 stack = self.stack
812 k = self.marker()
813 klass = stack[k + 1]
814 del stack[k + 1]
Tim Peters2344fae2001-01-15 00:50:52 +0000815 args = tuple(stack[k + 1:])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000816 del stack[k:]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000817 instantiated = 0
818 if (not args and type(klass) is ClassType and
819 not hasattr(klass, "__getinitargs__")):
820 try:
821 value = _EmptyClass()
822 value.__class__ = klass
823 instantiated = 1
824 except RuntimeError:
825 # In restricted execution, assignment to inst.__class__ is
826 # prohibited
827 pass
828 if not instantiated:
829 value = apply(klass, args)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000830 self.append(value)
Tim Peters2344fae2001-01-15 00:50:52 +0000831 dispatch[OBJ] = load_obj
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000832
833 def load_global(self):
834 module = self.readline()[:-1]
835 name = self.readline()[:-1]
836 klass = self.find_class(module, name)
837 self.append(klass)
838 dispatch[GLOBAL] = load_global
839
840 def find_class(self, module, name):
Barry Warsawbf4d9592001-11-15 23:42:58 +0000841 __import__(module)
842 mod = sys.modules[module]
843 klass = getattr(mod, name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000844 return klass
845
846 def load_reduce(self):
847 stack = self.stack
848
849 callable = stack[-2]
850 arg_tup = stack[-1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000851 del stack[-2:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000852
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000853 if type(callable) is not ClassType:
854 if not safe_constructors.has_key(callable):
855 try:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000856 safe = callable.__safe_for_unpickling__
857 except AttributeError:
858 safe = None
Guido van Rossuma48061a1995-01-10 00:31:14 +0000859
Tim Petersc32d8242001-04-10 02:48:53 +0000860 if not safe:
Tim Peters2344fae2001-01-15 00:50:52 +0000861 raise UnpicklingError, "%s is not safe for " \
862 "unpickling" % callable
Guido van Rossuma48061a1995-01-10 00:31:14 +0000863
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000864 if arg_tup is None:
Raymond Hettinger97394bc2002-05-21 17:22:02 +0000865 import warnings
866 warnings.warn("The None return argument form of __reduce__ is "
867 "deprecated. Return a tuple of arguments instead.",
Tim Peters8ac14952002-05-23 15:15:30 +0000868 DeprecationWarning)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000869 value = callable.__basicnew__()
870 else:
871 value = apply(callable, arg_tup)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000872 self.append(value)
873 dispatch[REDUCE] = load_reduce
Guido van Rossuma48061a1995-01-10 00:31:14 +0000874
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000875 def load_pop(self):
876 del self.stack[-1]
877 dispatch[POP] = load_pop
Guido van Rossum7b5430f1995-03-04 22:25:21 +0000878
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000879 def load_pop_mark(self):
880 k = self.marker()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000881 del self.stack[k:]
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000882 dispatch[POP_MARK] = load_pop_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +0000883
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000884 def load_dup(self):
Guido van Rossumb1062fc1998-03-31 17:00:46 +0000885 self.append(self.stack[-1])
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000886 dispatch[DUP] = load_dup
Guido van Rossuma48061a1995-01-10 00:31:14 +0000887
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000888 def load_get(self):
889 self.append(self.memo[self.readline()[:-1]])
890 dispatch[GET] = load_get
Guido van Rossum78536471996-04-12 13:36:27 +0000891
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000892 def load_binget(self):
893 i = mloads('i' + self.read(1) + '\000\000\000')
894 self.append(self.memo[`i`])
895 dispatch[BINGET] = load_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000896
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000897 def load_long_binget(self):
898 i = mloads('i' + self.read(4))
899 self.append(self.memo[`i`])
900 dispatch[LONG_BINGET] = load_long_binget
Guido van Rossum78536471996-04-12 13:36:27 +0000901
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000902 def load_put(self):
903 self.memo[self.readline()[:-1]] = self.stack[-1]
904 dispatch[PUT] = load_put
Guido van Rossuma48061a1995-01-10 00:31:14 +0000905
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000906 def load_binput(self):
907 i = mloads('i' + self.read(1) + '\000\000\000')
908 self.memo[`i`] = self.stack[-1]
909 dispatch[BINPUT] = load_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000910
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000911 def load_long_binput(self):
912 i = mloads('i' + self.read(4))
913 self.memo[`i`] = self.stack[-1]
914 dispatch[LONG_BINPUT] = load_long_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +0000915
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000916 def load_append(self):
917 stack = self.stack
918 value = stack[-1]
919 del stack[-1]
920 list = stack[-1]
921 list.append(value)
922 dispatch[APPEND] = load_append
Guido van Rossuma48061a1995-01-10 00:31:14 +0000923
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000924 def load_appends(self):
925 stack = self.stack
926 mark = self.marker()
927 list = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000928 for i in range(mark + 1, len(stack)):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000929 list.append(stack[i])
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000930
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000931 del stack[mark:]
932 dispatch[APPENDS] = load_appends
Tim Peters2344fae2001-01-15 00:50:52 +0000933
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000934 def load_setitem(self):
935 stack = self.stack
936 value = stack[-1]
937 key = stack[-2]
938 del stack[-2:]
939 dict = stack[-1]
940 dict[key] = value
941 dispatch[SETITEM] = load_setitem
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000942
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000943 def load_setitems(self):
944 stack = self.stack
945 mark = self.marker()
946 dict = stack[mark - 1]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000947 for i in range(mark + 1, len(stack), 2):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000948 dict[stack[i]] = stack[i + 1]
Guido van Rossuma48061a1995-01-10 00:31:14 +0000949
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000950 del stack[mark:]
951 dispatch[SETITEMS] = load_setitems
Guido van Rossuma48061a1995-01-10 00:31:14 +0000952
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000953 def load_build(self):
954 stack = self.stack
955 value = stack[-1]
956 del stack[-1]
957 inst = stack[-1]
958 try:
959 setstate = inst.__setstate__
960 except AttributeError:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000961 try:
962 inst.__dict__.update(value)
963 except RuntimeError:
964 # XXX In restricted execution, the instance's __dict__ is not
965 # accessible. Use the old way of unpickling the instance
966 # variables. This is a semantic different when unpickling in
967 # restricted vs. unrestricted modes.
968 for k, v in value.items():
969 setattr(inst, k, v)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000970 else:
971 setstate(value)
972 dispatch[BUILD] = load_build
Guido van Rossuma48061a1995-01-10 00:31:14 +0000973
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000974 def load_mark(self):
975 self.append(self.mark)
976 dispatch[MARK] = load_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +0000977
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000978 def load_stop(self):
979 value = self.stack[-1]
980 del self.stack[-1]
Guido van Rossumff871742000-12-13 18:11:56 +0000981 raise _Stop(value)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000982 dispatch[STOP] = load_stop
Guido van Rossuma48061a1995-01-10 00:31:14 +0000983
Guido van Rossume467be61997-12-05 19:42:42 +0000984# Helper class for load_inst/load_obj
985
986class _EmptyClass:
987 pass
Guido van Rossuma48061a1995-01-10 00:31:14 +0000988
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000989# Shorthands
990
Jeremy Hyltonabe2c622001-10-15 21:29:28 +0000991try:
992 from cStringIO import StringIO
993except ImportError:
994 from StringIO import StringIO
Guido van Rossumc7c5e691996-07-22 22:26:07 +0000995
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000996def dump(object, file, bin = 0):
997 Pickler(file, bin).dump(object)
Guido van Rossum0c891ce1995-03-14 15:09:05 +0000998
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000999def dumps(object, bin = 0):
1000 file = StringIO()
1001 Pickler(file, bin).dump(object)
1002 return file.getvalue()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001003
1004def load(file):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001005 return Unpickler(file).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001006
1007def loads(str):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001008 file = StringIO(str)
1009 return Unpickler(file).load()