blob: 5ab312f2acaee6c2cfb32595c9a779fb5a98262c [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
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +00003See module copyreg for a mechanism for registering custom picklers.
Tim Peters22a449a2003-01-27 20:16:36 +00004See module pickletools source for extensive comments.
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
Serhiy Storchaka531d1e52020-05-02 09:38:01 +030016 loads(bytes) -> 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
Victor Stinner7fa767e2014-03-20 09:16:38 +010026from types import FunctionType
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +000027from copyreg import dispatch_table
28from copyreg import _extension_registry, _inverted_registry, _extension_cache
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +030029from itertools import islice
Serhiy Storchaka0d554d72015-10-10 22:42:18 +030030from functools import partial
Guido van Rossumd3703791998-10-22 20:15:36 +000031import sys
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +030032from sys import maxsize
33from struct import pack, unpack
Skip Montanaro23bafc62001-02-18 03:10:09 +000034import re
Guido van Rossum2e6a4b32007-05-04 19:56:22 +000035import io
Walter Dörwald42748a82007-06-12 16:40:17 +000036import codecs
Antoine Pitroud9dfaa92009-06-04 20:32:06 +000037import _compat_pickle
Guido van Rossuma48061a1995-01-10 00:31:14 +000038
Skip Montanaro352674d2001-02-07 23:14:30 +000039__all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler",
Victor Stinner63ab4ba2019-06-13 13:58:51 +020040 "Unpickler", "dump", "dumps", "load", "loads"]
41
42try:
43 from _pickle import PickleBuffer
44 __all__.append("PickleBuffer")
45 _HAVE_PICKLE_BUFFER = True
46except ImportError:
47 _HAVE_PICKLE_BUFFER = False
48
Skip Montanaro352674d2001-02-07 23:14:30 +000049
Guido van Rossum98297ee2007-11-06 21:34:58 +000050# Shortcut for use in isinstance testing
Alexandre Vassalotti8cb02b62008-05-03 01:42:49 +000051bytes_types = (bytes, bytearray)
Guido van Rossum98297ee2007-11-06 21:34:58 +000052
Tim Petersc0c12b52003-01-29 00:56:17 +000053# These are purely informational; no code uses these.
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010054format_version = "4.0" # File format version we write
Guido van Rossumf29d3d62003-01-27 22:47:53 +000055compatible_formats = ["1.0", # Original protocol 0
Guido van Rossumbc64e222003-01-28 16:34:19 +000056 "1.1", # Protocol 0 with INST added
Guido van Rossumf29d3d62003-01-27 22:47:53 +000057 "1.2", # Original protocol 1
58 "1.3", # Protocol 1 with BINFLOAT added
59 "2.0", # Protocol 2
Guido van Rossumf4169812008-03-17 22:56:06 +000060 "3.0", # Protocol 3
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +010061 "4.0", # Protocol 4
Antoine Pitrou91f43802019-05-26 17:10:09 +020062 "5.0", # Protocol 5
Guido van Rossumf29d3d62003-01-27 22:47:53 +000063 ] # Old format versions we can read
Guido van Rossumb72cf2d1997-04-09 17:32:51 +000064
Guido van Rossum99603b02007-07-20 00:22:32 +000065# This is the highest protocol number we know how to read.
Antoine Pitrou91f43802019-05-26 17:10:09 +020066HIGHEST_PROTOCOL = 5
Tim Peters8587b3c2003-02-13 15:44:41 +000067
Guido van Rossum2e6a4b32007-05-04 19:56:22 +000068# The protocol we write by default. May be less than HIGHEST_PROTOCOL.
Łukasz Langac51d8c92018-04-03 23:06:53 -070069# Only bump this if the oldest still supported version of Python already
70# includes it.
71DEFAULT_PROTOCOL = 4
Guido van Rossum2e6a4b32007-05-04 19:56:22 +000072
Raymond Hettingeraef22fb2002-05-29 16:18:42 +000073class PickleError(Exception):
Neal Norwitzefbb67b2002-05-30 12:12:04 +000074 """A common base class for the other pickling exceptions."""
Raymond Hettingeraef22fb2002-05-29 16:18:42 +000075 pass
76
77class PicklingError(PickleError):
78 """This exception is raised when an unpicklable object is passed to the
79 dump() method.
80
81 """
82 pass
83
84class UnpicklingError(PickleError):
85 """This exception is raised when there is a problem unpickling an object,
86 such as a security violation.
87
88 Note that other exceptions may also be raised during unpickling, including
89 (but not necessarily limited to) AttributeError, EOFError, ImportError,
90 and IndexError.
91
92 """
93 pass
Guido van Rossum7849da81995-03-09 14:08:35 +000094
Tim Petersc0c12b52003-01-29 00:56:17 +000095# An instance of _Stop is raised by Unpickler.load_stop() in response to
96# the STOP opcode, passing the object that is the result of unpickling.
Guido van Rossumff871742000-12-13 18:11:56 +000097class _Stop(Exception):
98 def __init__(self, value):
99 self.value = value
100
Guido van Rossum533dbcf2003-01-28 17:55:05 +0000101# Jython has PyStringMap; it's a dict subclass with string keys
Jeremy Hylton2b9d0291998-05-27 22:38:22 +0000102try:
103 from org.python.core import PyStringMap
Brett Cannoncd171c82013-07-04 17:43:24 -0400104except ImportError:
Jeremy Hylton2b9d0291998-05-27 22:38:22 +0000105 PyStringMap = None
106
Tim Peters22a449a2003-01-27 20:16:36 +0000107# Pickle opcodes. See pickletools.py for extensive docs. The listing
108# here is in kind-of alphabetical order of 1-character pickle code.
109# pickletools groups them by purpose.
Guido van Rossumdbb718f2001-09-21 19:22:34 +0000110
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000111MARK = b'(' # push special markobject on stack
112STOP = b'.' # every pickle ends with STOP
113POP = b'0' # discard topmost stack item
114POP_MARK = b'1' # discard stack top through topmost markobject
115DUP = b'2' # duplicate top stack item
116FLOAT = b'F' # push float object; decimal string argument
117INT = b'I' # push integer or bool; decimal string argument
118BININT = b'J' # push four-byte signed int
119BININT1 = b'K' # push 1-byte unsigned int
120LONG = b'L' # push long; decimal string argument
121BININT2 = b'M' # push 2-byte unsigned int
122NONE = b'N' # push None
123PERSID = b'P' # push persistent object; id is taken from string arg
124BINPERSID = b'Q' # " " " ; " " " " stack
125REDUCE = b'R' # apply callable to argtuple, both on stack
126STRING = b'S' # push string; NL-terminated string argument
127BINSTRING = b'T' # push string; counted binary string argument
128SHORT_BINSTRING= b'U' # " " ; " " " " < 256 bytes
129UNICODE = b'V' # push Unicode string; raw-unicode-escaped'd argument
130BINUNICODE = b'X' # " " " ; counted UTF-8 string argument
131APPEND = b'a' # append stack top to list below it
132BUILD = b'b' # call __setstate__ or __dict__.update()
133GLOBAL = b'c' # push self.find_class(modname, name); 2 string args
134DICT = b'd' # build a dict from stack items
135EMPTY_DICT = b'}' # push empty dict
136APPENDS = b'e' # extend list on stack by topmost stack slice
137GET = b'g' # push item from memo on stack; index is string arg
138BINGET = b'h' # " " " " " " ; " " 1-byte arg
139INST = b'i' # build & push class instance
140LONG_BINGET = b'j' # push item from memo on stack; index is 4-byte arg
141LIST = b'l' # build list from topmost stack items
142EMPTY_LIST = b']' # push empty list
143OBJ = b'o' # build & push class instance
144PUT = b'p' # store stack top in memo; index is string arg
145BINPUT = b'q' # " " " " " ; " " 1-byte arg
146LONG_BINPUT = b'r' # " " " " " ; " " 4-byte arg
147SETITEM = b's' # add key+value pair to dict
148TUPLE = b't' # build tuple from topmost stack items
149EMPTY_TUPLE = b')' # push empty tuple
150SETITEMS = b'u' # modify dict by adding topmost key+value pairs
151BINFLOAT = b'G' # push float; arg is 8-byte float encoding
Tim Peters22a449a2003-01-27 20:16:36 +0000152
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000153TRUE = b'I01\n' # not an opcode; see INT docs in pickletools.py
154FALSE = b'I00\n' # not an opcode; see INT docs in pickletools.py
Guido van Rossum77f6a652002-04-03 22:41:51 +0000155
Guido van Rossum586c9e82003-01-29 06:16:12 +0000156# Protocol 2
Guido van Rossum5a2d8f52003-01-27 21:44:25 +0000157
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000158PROTO = b'\x80' # identify pickle protocol
159NEWOBJ = b'\x81' # build object by applying cls.__new__ to argtuple
160EXT1 = b'\x82' # push object from extension registry; 1-byte index
161EXT2 = b'\x83' # ditto, but 2-byte index
162EXT4 = b'\x84' # ditto, but 4-byte index
163TUPLE1 = b'\x85' # build 1-tuple from stack top
164TUPLE2 = b'\x86' # build 2-tuple from two topmost stack items
165TUPLE3 = b'\x87' # build 3-tuple from three topmost stack items
166NEWTRUE = b'\x88' # push True
167NEWFALSE = b'\x89' # push False
168LONG1 = b'\x8a' # push long from < 256 bytes
169LONG4 = b'\x8b' # push really big long
Guido van Rossum5a2d8f52003-01-27 21:44:25 +0000170
Guido van Rossum44f0ea52003-01-28 04:14:51 +0000171_tuplesize2code = [EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3]
172
Guido van Rossumf4169812008-03-17 22:56:06 +0000173# Protocol 3 (Python 3.x)
174
175BINBYTES = b'B' # push bytes; counted binary string argument
176SHORT_BINBYTES = b'C' # " " ; " " " " < 256 bytes
Guido van Rossuma48061a1995-01-10 00:31:14 +0000177
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100178# Protocol 4
Antoine Pitrou91f43802019-05-26 17:10:09 +0200179
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100180SHORT_BINUNICODE = b'\x8c' # push short string; UTF-8 length < 256 bytes
181BINUNICODE8 = b'\x8d' # push very long string
182BINBYTES8 = b'\x8e' # push very long bytes string
183EMPTY_SET = b'\x8f' # push empty set on the stack
184ADDITEMS = b'\x90' # modify set by adding topmost stack items
185FROZENSET = b'\x91' # build frozenset from topmost stack items
186NEWOBJ_EX = b'\x92' # like NEWOBJ but work with keyword only arguments
187STACK_GLOBAL = b'\x93' # same as GLOBAL but using names on the stacks
188MEMOIZE = b'\x94' # store top of the stack in memo
189FRAME = b'\x95' # indicate the beginning of a new frame
190
Antoine Pitrou91f43802019-05-26 17:10:09 +0200191# Protocol 5
192
193BYTEARRAY8 = b'\x96' # push bytearray
194NEXT_BUFFER = b'\x97' # push next out-of-band buffer
195READONLY_BUFFER = b'\x98' # make top of stack readonly
196
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100197__all__.extend([x for x in dir() if re.match("[A-Z][A-Z0-9_]+$", x)])
198
199
200class _Framer:
201
Serhiy Storchaka1211c9a2018-01-20 16:42:44 +0200202 _FRAME_SIZE_MIN = 4
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100203 _FRAME_SIZE_TARGET = 64 * 1024
204
205 def __init__(self, file_write):
206 self.file_write = file_write
207 self.current_frame = None
208
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100209 def start_framing(self):
210 self.current_frame = io.BytesIO()
211
212 def end_framing(self):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800213 if self.current_frame and self.current_frame.tell() > 0:
214 self.commit_frame(force=True)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100215 self.current_frame = None
216
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800217 def commit_frame(self, force=False):
218 if self.current_frame:
219 f = self.current_frame
220 if f.tell() >= self._FRAME_SIZE_TARGET or force:
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100221 data = f.getbuffer()
222 write = self.file_write
Serhiy Storchaka1211c9a2018-01-20 16:42:44 +0200223 if len(data) >= self._FRAME_SIZE_MIN:
224 # Issue a single call to the write method of the underlying
225 # file object for the frame opcode with the size of the
226 # frame. The concatenation is expected to be less expensive
227 # than issuing an additional call to write.
228 write(FRAME + pack("<Q", len(data)))
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100229
230 # Issue a separate call to write to append the frame
231 # contents without concatenation to the above to avoid a
232 # memory copy.
233 write(data)
234
235 # Start the new frame with a new io.BytesIO instance so that
236 # the file object can have delayed access to the previous frame
237 # contents via an unreleased memoryview of the previous
238 # io.BytesIO instance.
239 self.current_frame = io.BytesIO()
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800240
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100241 def write(self, data):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800242 if self.current_frame:
243 return self.current_frame.write(data)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100244 else:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800245 return self.file_write(data)
246
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100247 def write_large_bytes(self, header, payload):
248 write = self.file_write
249 if self.current_frame:
250 # Terminate the current frame and flush it to the file.
251 self.commit_frame(force=True)
252
253 # Perform direct write of the header and payload of the large binary
254 # object. Be careful not to concatenate the header and the payload
255 # prior to calling 'write' as we do not want to allocate a large
256 # temporary bytes object.
257 # We intentionally do not insert a protocol 4 frame opcode to make
258 # it possible to optimize file.read calls in the loader.
259 write(header)
260 write(payload)
261
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100262
263class _Unframer:
264
265 def __init__(self, file_read, file_readline, file_tell=None):
266 self.file_read = file_read
267 self.file_readline = file_readline
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100268 self.current_frame = None
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100269
Antoine Pitrou91f43802019-05-26 17:10:09 +0200270 def readinto(self, buf):
271 if self.current_frame:
272 n = self.current_frame.readinto(buf)
273 if n == 0 and len(buf) != 0:
274 self.current_frame = None
275 n = len(buf)
276 buf[:] = self.file_read(n)
277 return n
278 if n < len(buf):
279 raise UnpicklingError(
280 "pickle exhausted before end of frame")
281 return n
282 else:
283 n = len(buf)
284 buf[:] = self.file_read(n)
285 return n
286
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100287 def read(self, n):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800288 if self.current_frame:
289 data = self.current_frame.read(n)
290 if not data and n != 0:
291 self.current_frame = None
292 return self.file_read(n)
293 if len(data) < n:
294 raise UnpicklingError(
295 "pickle exhausted before end of frame")
296 return data
297 else:
298 return self.file_read(n)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100299
300 def readline(self):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800301 if self.current_frame:
302 data = self.current_frame.readline()
303 if not data:
304 self.current_frame = None
305 return self.file_readline()
Serhiy Storchaka21d75332015-01-26 10:37:01 +0200306 if data[-1] != b'\n'[0]:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800307 raise UnpicklingError(
308 "pickle exhausted before end of frame")
309 return data
310 else:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100311 return self.file_readline()
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100312
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800313 def load_frame(self, frame_size):
314 if self.current_frame and self.current_frame.read() != b'':
315 raise UnpicklingError(
316 "beginning of a new frame before end of current frame")
317 self.current_frame = io.BytesIO(self.file_read(frame_size))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100318
319
320# Tools used for pickling.
321
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300322def _getattribute(obj, name):
323 for subpath in name.split('.'):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100324 if subpath == '<locals>':
325 raise AttributeError("Can't get local attribute {!r} on {!r}"
326 .format(name, obj))
327 try:
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300328 parent = obj
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100329 obj = getattr(obj, subpath)
330 except AttributeError:
331 raise AttributeError("Can't get attribute {!r} on {!r}"
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300332 .format(name, obj)) from None
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300333 return obj, parent
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100334
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300335def whichmodule(obj, name):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100336 """Find the module an object belong to."""
337 module_name = getattr(obj, '__module__', None)
338 if module_name is not None:
339 return module_name
Antoine Pitroue1618492014-10-04 22:15:27 +0200340 # Protect the iteration by using a list copy of sys.modules against dynamic
341 # modules that trigger imports of other modules upon calls to getattr.
Raymond Hettinger75bedbe2020-04-21 16:20:52 -0700342 for module_name, module in sys.modules.copy().items():
Renato Cunha86684312020-11-29 15:23:15 -0300343 if (module_name == '__main__'
344 or module_name == '__mp_main__' # bpo-42406
345 or module is None):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100346 continue
347 try:
Serhiy Storchaka58e41342015-03-31 14:07:24 +0300348 if _getattribute(module, name)[0] is obj:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100349 return module_name
350 except AttributeError:
351 pass
352 return '__main__'
353
354def encode_long(x):
355 r"""Encode a long to a two's complement little-endian binary string.
356 Note that 0 is a special case, returning an empty string, to save a
357 byte in the LONG1 pickling context.
358
359 >>> encode_long(0)
360 b''
361 >>> encode_long(255)
362 b'\xff\x00'
363 >>> encode_long(32767)
364 b'\xff\x7f'
365 >>> encode_long(-256)
366 b'\x00\xff'
367 >>> encode_long(-32768)
368 b'\x00\x80'
369 >>> encode_long(-128)
370 b'\x80'
371 >>> encode_long(127)
372 b'\x7f'
373 >>>
374 """
375 if x == 0:
376 return b''
377 nbytes = (x.bit_length() >> 3) + 1
378 result = x.to_bytes(nbytes, byteorder='little', signed=True)
379 if x < 0 and nbytes > 1:
380 if result[-1] == 0xff and (result[-2] & 0x80) != 0:
381 result = result[:-1]
382 return result
383
384def decode_long(data):
385 r"""Decode a long from a two's complement little-endian binary string.
386
387 >>> decode_long(b'')
388 0
389 >>> decode_long(b"\xff\x00")
390 255
391 >>> decode_long(b"\xff\x7f")
392 32767
393 >>> decode_long(b"\x00\xff")
394 -256
395 >>> decode_long(b"\x00\x80")
396 -32768
397 >>> decode_long(b"\x80")
398 -128
399 >>> decode_long(b"\x7f")
400 127
401 """
402 return int.from_bytes(data, byteorder='little', signed=True)
403
Skip Montanaro23bafc62001-02-18 03:10:09 +0000404
Guido van Rossum1be31752003-01-28 15:19:53 +0000405# Pickling machinery
406
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000407class _Pickler:
Guido van Rossuma48061a1995-01-10 00:31:14 +0000408
Antoine Pitrou91f43802019-05-26 17:10:09 +0200409 def __init__(self, file, protocol=None, *, fix_imports=True,
410 buffer_callback=None):
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000411 """This takes a binary file for writing a pickle data stream.
412
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800413 The optional *protocol* argument tells the pickler to use the
Mark Dickinsone9652e82020-01-24 10:03:22 +0000414 given protocol; supported protocols are 0, 1, 2, 3, 4 and 5.
415 The default protocol is 4. It was introduced in Python 3.4, and
416 is incompatible with previous versions.
Guido van Rossumf29d3d62003-01-27 22:47:53 +0000417
Guido van Rossum7eff63a2003-01-31 19:42:31 +0000418 Specifying a negative protocol version selects the highest
Tim Peters5bd2a792003-02-01 16:45:06 +0000419 protocol version supported. The higher the protocol used, the
420 more recent the version of Python needed to read the pickle
421 produced.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000422
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800423 The *file* argument must have a write() method that accepts a
424 single bytes argument. It can thus be a file object opened for
Martin Panter7462b6492015-11-02 03:37:02 +0000425 binary writing, an io.BytesIO instance, or any other custom
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800426 object that meets this interface.
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000427
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800428 If *fix_imports* is True and *protocol* is less than 3, pickle
429 will try to map the new Python 3 names to the old module names
430 used in Python 2, so that the pickle data stream is readable
431 with Python 2.
Antoine Pitrou91f43802019-05-26 17:10:09 +0200432
433 If *buffer_callback* is None (the default), buffer views are
434 serialized into *file* as part of the pickle stream.
435
436 If *buffer_callback* is not None, then it can be called any number
437 of times with a buffer view. If the callback returns a false value
438 (such as None), the given buffer is out-of-band; otherwise the
439 buffer is serialized in-band, i.e. inside the pickle stream.
440
441 It is an error if *buffer_callback* is not None and *protocol*
442 is None or smaller than 5.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000443 """
Guido van Rossumcf117b02003-02-09 17:19:41 +0000444 if protocol is None:
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000445 protocol = DEFAULT_PROTOCOL
Guido van Rossumcf117b02003-02-09 17:19:41 +0000446 if protocol < 0:
Tim Peters8587b3c2003-02-13 15:44:41 +0000447 protocol = HIGHEST_PROTOCOL
448 elif not 0 <= protocol <= HIGHEST_PROTOCOL:
449 raise ValueError("pickle protocol must be <= %d" % HIGHEST_PROTOCOL)
Antoine Pitrou91f43802019-05-26 17:10:09 +0200450 if buffer_callback is not None and protocol < 5:
451 raise ValueError("buffer_callback needs protocol >= 5")
452 self._buffer_callback = buffer_callback
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000453 try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100454 self._file_write = file.write
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000455 except AttributeError:
456 raise TypeError("file must have a 'write' attribute")
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800457 self.framer = _Framer(self._file_write)
458 self.write = self.framer.write
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100459 self._write_large_bytes = self.framer.write_large_bytes
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000460 self.memo = {}
Guido van Rossumcf117b02003-02-09 17:19:41 +0000461 self.proto = int(protocol)
462 self.bin = protocol >= 1
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000463 self.fast = 0
Antoine Pitroud9dfaa92009-06-04 20:32:06 +0000464 self.fix_imports = fix_imports and protocol < 3
Guido van Rossuma48061a1995-01-10 00:31:14 +0000465
Fred Drake7f781c92002-05-01 20:33:53 +0000466 def clear_memo(self):
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000467 """Clears the pickler's "memo".
468
469 The memo is the data structure that remembers which objects the
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -0800470 pickler has already seen, so that shared or recursive objects
471 are pickled by reference and not by value. This method is
472 useful when re-using picklers.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +0000473 """
Fred Drake7f781c92002-05-01 20:33:53 +0000474 self.memo.clear()
475
Guido van Rossum3a41c612003-01-28 15:10:22 +0000476 def dump(self, obj):
Tim Peters5bd2a792003-02-01 16:45:06 +0000477 """Write a pickled representation of obj to the open file."""
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +0000478 # Check whether Pickler was initialized correctly. This is
479 # only needed to mimic the behavior of _pickle.Pickler.dump().
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100480 if not hasattr(self, "_file_write"):
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +0000481 raise PicklingError("Pickler.__init__() was not called by "
482 "%s.__init__()" % (self.__class__.__name__,))
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000483 if self.proto >= 2:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800484 self.write(PROTO + pack("<B", self.proto))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100485 if self.proto >= 4:
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800486 self.framer.start_framing()
Guido van Rossum3a41c612003-01-28 15:10:22 +0000487 self.save(obj)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000488 self.write(STOP)
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800489 self.framer.end_framing()
Guido van Rossuma48061a1995-01-10 00:31:14 +0000490
Jeremy Hylton3422c992003-01-24 19:29:52 +0000491 def memoize(self, obj):
492 """Store an object in the memo."""
493
Tim Peterse46b73f2003-01-27 21:22:10 +0000494 # The Pickler memo is a dictionary mapping object ids to 2-tuples
495 # that contain the Unpickler memo key and the object being memoized.
496 # The memo key is written to the pickle and will become
Jeremy Hylton3422c992003-01-24 19:29:52 +0000497 # the key in the Unpickler's memo. The object is stored in the
Tim Peterse46b73f2003-01-27 21:22:10 +0000498 # Pickler memo so that transient objects are kept alive during
499 # pickling.
Jeremy Hylton3422c992003-01-24 19:29:52 +0000500
Tim Peterse46b73f2003-01-27 21:22:10 +0000501 # The use of the Unpickler memo length as the memo key is just a
502 # convention. The only requirement is that the memo values be unique.
503 # But there appears no advantage to any other scheme, and this
Tim Peterscbd0a322003-01-28 00:24:43 +0000504 # scheme allows the Unpickler memo to be implemented as a plain (but
Tim Peterse46b73f2003-01-27 21:22:10 +0000505 # growable) array, indexed by memo key.
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000506 if self.fast:
507 return
Guido van Rossum9b40e802003-01-30 06:37:41 +0000508 assert id(obj) not in self.memo
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100509 idx = len(self.memo)
510 self.write(self.put(idx))
511 self.memo[id(obj)] = idx, obj
Jeremy Hylton3422c992003-01-24 19:29:52 +0000512
Tim Petersbb38e302003-01-27 21:25:41 +0000513 # Return a PUT (BINPUT, LONG_BINPUT) opcode string, with argument i.
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100514 def put(self, idx):
515 if self.proto >= 4:
516 return MEMOIZE
517 elif self.bin:
518 if idx < 256:
519 return BINPUT + pack("<B", idx)
Guido van Rossum5c938d02003-01-28 03:03:08 +0000520 else:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100521 return LONG_BINPUT + pack("<I", idx)
522 else:
523 return PUT + repr(idx).encode("ascii") + b'\n'
Guido van Rossuma48061a1995-01-10 00:31:14 +0000524
Tim Petersbb38e302003-01-27 21:25:41 +0000525 # Return a GET (BINGET, LONG_BINGET) opcode string, with argument i.
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300526 def get(self, i):
Tim Petersc32d8242001-04-10 02:48:53 +0000527 if self.bin:
Tim Petersc32d8242001-04-10 02:48:53 +0000528 if i < 256:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300529 return BINGET + pack("<B", i)
Guido van Rossum5c938d02003-01-28 03:03:08 +0000530 else:
Antoine Pitroubf6ecf92012-11-24 20:40:21 +0100531 return LONG_BINGET + pack("<I", i)
Guido van Rossuma48061a1995-01-10 00:31:14 +0000532
Guido van Rossum39478e82007-08-27 17:23:59 +0000533 return GET + repr(i).encode("ascii") + b'\n'
Tim Peters2344fae2001-01-15 00:50:52 +0000534
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000535 def save(self, obj, save_persistent_id=True):
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -0800536 self.framer.commit_frame()
537
Guido van Rossumbc64e222003-01-28 16:34:19 +0000538 # Check for persistent id (defined by a subclass)
Guido van Rossum3a41c612003-01-28 15:10:22 +0000539 pid = self.persistent_id(obj)
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000540 if pid is not None and save_persistent_id:
Jeremy Hylton5e0f4e72002-11-13 22:01:27 +0000541 self.save_pers(pid)
542 return
Guido van Rossuma48061a1995-01-10 00:31:14 +0000543
Guido van Rossumbc64e222003-01-28 16:34:19 +0000544 # Check the memo
545 x = self.memo.get(id(obj))
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300546 if x is not None:
Guido van Rossumbc64e222003-01-28 16:34:19 +0000547 self.write(self.get(x[0]))
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000548 return
549
Pierre Glaser289f1f82019-05-08 23:08:25 +0200550 rv = NotImplemented
551 reduce = getattr(self, "reducer_override", None)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300552 if reduce is not None:
Guido van Rossumc53f0092003-02-18 22:05:12 +0000553 rv = reduce(obj)
Pierre Glaser289f1f82019-05-08 23:08:25 +0200554
555 if rv is NotImplemented:
556 # Check the type dispatch table
557 t = type(obj)
558 f = self.dispatch.get(t)
559 if f is not None:
560 f(self, obj) # Call unbound method with explicit self
Antoine Pitrouffd41d92011-10-04 09:23:04 +0200561 return
562
Pierre Glaser289f1f82019-05-08 23:08:25 +0200563 # Check private dispatch table if any, or else
564 # copyreg.dispatch_table
565 reduce = getattr(self, 'dispatch_table', dispatch_table).get(t)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300566 if reduce is not None:
Pierre Glaser289f1f82019-05-08 23:08:25 +0200567 rv = reduce(obj)
Guido van Rossumc53f0092003-02-18 22:05:12 +0000568 else:
Pierre Glaser289f1f82019-05-08 23:08:25 +0200569 # Check for a class with a custom metaclass; treat as regular
570 # class
571 if issubclass(t, type):
572 self.save_global(obj)
573 return
574
575 # Check for a __reduce_ex__ method, fall back to __reduce__
576 reduce = getattr(obj, "__reduce_ex__", None)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300577 if reduce is not None:
Pierre Glaser289f1f82019-05-08 23:08:25 +0200578 rv = reduce(self.proto)
Guido van Rossumc53f0092003-02-18 22:05:12 +0000579 else:
Pierre Glaser289f1f82019-05-08 23:08:25 +0200580 reduce = getattr(obj, "__reduce__", None)
581 if reduce is not None:
582 rv = reduce()
583 else:
584 raise PicklingError("Can't pickle %r object: %r" %
585 (t.__name__, obj))
Tim Petersb32a8312003-01-28 00:48:09 +0000586
Guido van Rossumbc64e222003-01-28 16:34:19 +0000587 # Check for string returned by reduce(), meaning "save as global"
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000588 if isinstance(rv, str):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000589 self.save_global(obj, rv)
Tim Petersb32a8312003-01-28 00:48:09 +0000590 return
591
Guido van Rossumbc64e222003-01-28 16:34:19 +0000592 # Assert that reduce() returned a tuple
Guido van Rossum13257902007-06-07 23:15:56 +0000593 if not isinstance(rv, tuple):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000594 raise PicklingError("%s must return string or tuple" % reduce)
Tim Petersb32a8312003-01-28 00:48:09 +0000595
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000596 # Assert that it returned an appropriately sized tuple
Guido van Rossumbc64e222003-01-28 16:34:19 +0000597 l = len(rv)
Pierre Glaser65d98d02019-05-08 21:40:25 +0200598 if not (2 <= l <= 6):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000599 raise PicklingError("Tuple returned by %s must have "
Pierre Glaser65d98d02019-05-08 21:40:25 +0200600 "two to six elements" % reduce)
Tim Petersb32a8312003-01-28 00:48:09 +0000601
Guido van Rossumbc64e222003-01-28 16:34:19 +0000602 # Save the reduce() output and finally memoize the object
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000603 self.save_reduce(obj=obj, *rv)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000604
Guido van Rossum3a41c612003-01-28 15:10:22 +0000605 def persistent_id(self, obj):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000606 # This exists so a subclass can override it
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000607 return None
608
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000609 def save_pers(self, pid):
Guido van Rossumbc64e222003-01-28 16:34:19 +0000610 # Save a persistent id reference
Tim Petersbd1cdb92003-01-28 01:03:10 +0000611 if self.bin:
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000612 self.save(pid, save_persistent_id=False)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000613 self.write(BINPERSID)
Tim Petersbd1cdb92003-01-28 01:03:10 +0000614 else:
Serhiy Storchakadec25af2016-07-17 11:24:17 +0300615 try:
616 self.write(PERSID + str(pid).encode("ascii") + b'\n')
617 except UnicodeEncodeError:
618 raise PicklingError(
619 "persistent IDs in protocol 0 must be ASCII strings")
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000620
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100621 def save_reduce(self, func, args, state=None, listitems=None,
Pierre Glaser65d98d02019-05-08 21:40:25 +0200622 dictitems=None, state_setter=None, obj=None):
Jeremy Hyltone3a565e2003-06-29 16:59:59 +0000623 # This API is called by some subclasses
Guido van Rossumbc64e222003-01-28 16:34:19 +0000624
Guido van Rossum13257902007-06-07 23:15:56 +0000625 if not isinstance(args, tuple):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100626 raise PicklingError("args from save_reduce() must be a tuple")
Florent Xicluna5d1155c2011-10-28 14:45:05 +0200627 if not callable(func):
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100628 raise PicklingError("func from save_reduce() must be callable")
Guido van Rossumbc64e222003-01-28 16:34:19 +0000629
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000630 save = self.save
Guido van Rossumbc64e222003-01-28 16:34:19 +0000631 write = self.write
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000632
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100633 func_name = getattr(func, "__name__", "")
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300634 if self.proto >= 2 and func_name == "__newobj_ex__":
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100635 cls, args, kwargs = args
636 if not hasattr(cls, "__new__"):
637 raise PicklingError("args[0] from {} args has no __new__"
638 .format(func_name))
639 if obj is not None and cls is not obj.__class__:
640 raise PicklingError("args[0] from {} args has the wrong class"
641 .format(func_name))
Serhiy Storchaka0d554d72015-10-10 22:42:18 +0300642 if self.proto >= 4:
643 save(cls)
644 save(args)
645 save(kwargs)
646 write(NEWOBJ_EX)
647 else:
648 func = partial(cls.__new__, cls, *args, **kwargs)
649 save(func)
650 save(())
651 write(REDUCE)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100652 elif self.proto >= 2 and func_name == "__newobj__":
653 # A __reduce__ implementation can direct protocol 2 or newer to
Guido van Rossumd053b4b2003-01-31 16:51:45 +0000654 # use the more efficient NEWOBJ opcode, while still
655 # allowing protocol 0 and 1 to work normally. For this to
656 # work, the function returned by __reduce__ should be
657 # called __newobj__, and its first argument should be a
Florent Xiclunaaa6c1d22011-12-12 18:54:29 +0100658 # class. The implementation for __newobj__
Guido van Rossumd053b4b2003-01-31 16:51:45 +0000659 # should be as follows, although pickle has no way to
660 # verify this:
661 #
662 # def __newobj__(cls, *args):
663 # return cls.__new__(cls, *args)
664 #
665 # Protocols 0 and 1 will pickle a reference to __newobj__,
666 # while protocol 2 (and above) will pickle a reference to
667 # cls, the remaining args tuple, and the NEWOBJ code,
668 # which calls cls.__new__(cls, *args) at unpickling time
669 # (see load_newobj below). If __reduce__ returns a
670 # three-tuple, the state from the third tuple item will be
671 # pickled regardless of the protocol, calling __setstate__
672 # at unpickling time (see load_build below).
673 #
674 # Note that no standard __newobj__ implementation exists;
675 # you have to provide your own. This is to enforce
676 # compatibility with Python 2.2 (pickles written using
677 # protocol 0 or 1 in Python 2.3 should be unpicklable by
678 # Python 2.2).
679 cls = args[0]
680 if not hasattr(cls, "__new__"):
681 raise PicklingError(
682 "args[0] from __newobj__ args has no __new__")
Guido van Rossumf7f45172003-01-31 17:17:49 +0000683 if obj is not None and cls is not obj.__class__:
684 raise PicklingError(
685 "args[0] from __newobj__ args has the wrong class")
Guido van Rossumd053b4b2003-01-31 16:51:45 +0000686 args = args[1:]
687 save(cls)
688 save(args)
689 write(NEWOBJ)
690 else:
691 save(func)
692 save(args)
693 write(REDUCE)
Tim Peters2344fae2001-01-15 00:50:52 +0000694
Guido van Rossumf7f45172003-01-31 17:17:49 +0000695 if obj is not None:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100696 # If the object is already in the memo, this means it is
697 # recursive. In this case, throw away everything we put on the
698 # stack, and fetch the object back from the memo.
699 if id(obj) in self.memo:
700 write(POP + self.get(self.memo[id(obj)][0]))
701 else:
702 self.memoize(obj)
Guido van Rossumf7f45172003-01-31 17:17:49 +0000703
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000704 # More new special cases (that work with older protocols as
705 # well): when __reduce__ returns a tuple with 4 or 5 items,
706 # the 4th and 5th item should be iterators that provide list
707 # items and dict items (as (key, value) tuples), or None.
708
709 if listitems is not None:
710 self._batch_appends(listitems)
711
712 if dictitems is not None:
713 self._batch_setitems(dictitems)
714
Tim Petersc32d8242001-04-10 02:48:53 +0000715 if state is not None:
Pierre Glaser65d98d02019-05-08 21:40:25 +0200716 if state_setter is None:
717 save(state)
718 write(BUILD)
719 else:
720 # If a state_setter is specified, call it instead of load_build
721 # to update obj's with its previous state.
722 # First, push state_setter and its tuple of expected arguments
723 # (obj, state) onto the stack.
724 save(state_setter)
725 save(obj) # simple BINGET opcode as obj is already memoized.
726 save(state)
727 write(TUPLE2)
728 # Trigger a state_setter(obj, state) function call.
729 write(REDUCE)
730 # The purpose of state_setter is to carry-out an
731 # inplace modification of obj. We do not care about what the
732 # method might return, so its output is eventually removed from
733 # the stack.
734 write(POP)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000735
Guido van Rossumbc64e222003-01-28 16:34:19 +0000736 # Methods below this point are dispatched through the dispatch table
737
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000738 dispatch = {}
739
Guido van Rossum3a41c612003-01-28 15:10:22 +0000740 def save_none(self, obj):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000741 self.write(NONE)
Guido van Rossum13257902007-06-07 23:15:56 +0000742 dispatch[type(None)] = save_none
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000743
Guido van Rossum3a41c612003-01-28 15:10:22 +0000744 def save_bool(self, obj):
Guido van Rossum7d97d312003-01-28 04:25:27 +0000745 if self.proto >= 2:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300746 self.write(NEWTRUE if obj else NEWFALSE)
Guido van Rossum7d97d312003-01-28 04:25:27 +0000747 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300748 self.write(TRUE if obj else FALSE)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000749 dispatch[bool] = save_bool
750
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300751 def save_long(self, obj):
Guido van Rossumddefaf32007-01-14 03:31:43 +0000752 if self.bin:
753 # If the int is small enough to fit in a signed 4-byte 2's-comp
754 # format, we can store it more efficiently than the general
755 # case.
756 # First one- and two-byte unsigned ints:
757 if obj >= 0:
758 if obj <= 0xff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300759 self.write(BININT1 + pack("<B", obj))
Guido van Rossumddefaf32007-01-14 03:31:43 +0000760 return
761 if obj <= 0xffff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300762 self.write(BININT2 + pack("<H", obj))
Guido van Rossumddefaf32007-01-14 03:31:43 +0000763 return
764 # Next check for 4-byte signed ints:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300765 if -0x80000000 <= obj <= 0x7fffffff:
Guido van Rossumddefaf32007-01-14 03:31:43 +0000766 self.write(BININT + pack("<i", obj))
767 return
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000768 if self.proto >= 2:
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000769 encoded = encode_long(obj)
770 n = len(encoded)
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000771 if n < 256:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300772 self.write(LONG1 + pack("<B", n) + encoded)
Guido van Rossumd6c9e632003-01-28 03:49:52 +0000773 else:
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000774 self.write(LONG4 + pack("<i", n) + encoded)
Tim Petersee1a53c2003-02-02 02:57:53 +0000775 return
Serhiy Storchaka3daaafb2017-11-16 09:44:43 +0200776 if -0x80000000 <= obj <= 0x7fffffff:
777 self.write(INT + repr(obj).encode("ascii") + b'\n')
778 else:
779 self.write(LONG + repr(obj).encode("ascii") + b'L\n')
Guido van Rossum13257902007-06-07 23:15:56 +0000780 dispatch[int] = save_long
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000781
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300782 def save_float(self, obj):
Guido van Rossumd3703791998-10-22 20:15:36 +0000783 if self.bin:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000784 self.write(BINFLOAT + pack('>d', obj))
Guido van Rossumd3703791998-10-22 20:15:36 +0000785 else:
Guido van Rossum39478e82007-08-27 17:23:59 +0000786 self.write(FLOAT + repr(obj).encode("ascii") + b'\n')
Guido van Rossum13257902007-06-07 23:15:56 +0000787 dispatch[float] = save_float
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000788
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300789 def save_bytes(self, obj):
Guido van Rossumf4169812008-03-17 22:56:06 +0000790 if self.proto < 3:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300791 if not obj: # bytes object is empty
Alexandre Vassalotti3bfc65a2011-12-13 13:08:09 -0500792 self.save_reduce(bytes, (), obj=obj)
793 else:
794 self.save_reduce(codecs.encode,
795 (str(obj, 'latin1'), 'latin1'), obj=obj)
Guido van Rossumf4169812008-03-17 22:56:06 +0000796 return
797 n = len(obj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100798 if n <= 0xff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300799 self.write(SHORT_BINBYTES + pack("<B", n) + obj)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100800 elif n > 0xffffffff and self.proto >= 4:
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100801 self._write_large_bytes(BINBYTES8 + pack("<Q", n), obj)
802 elif n >= self.framer._FRAME_SIZE_TARGET:
803 self._write_large_bytes(BINBYTES + pack("<I", n), obj)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000804 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300805 self.write(BINBYTES + pack("<I", n) + obj)
Guido van Rossum3a41c612003-01-28 15:10:22 +0000806 self.memoize(obj)
Guido van Rossumf4169812008-03-17 22:56:06 +0000807 dispatch[bytes] = save_bytes
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000808
Antoine Pitrou91f43802019-05-26 17:10:09 +0200809 def save_bytearray(self, obj):
810 if self.proto < 5:
811 if not obj: # bytearray is empty
812 self.save_reduce(bytearray, (), obj=obj)
813 else:
814 self.save_reduce(bytearray, (bytes(obj),), obj=obj)
815 return
816 n = len(obj)
817 if n >= self.framer._FRAME_SIZE_TARGET:
818 self._write_large_bytes(BYTEARRAY8 + pack("<Q", n), obj)
819 else:
820 self.write(BYTEARRAY8 + pack("<Q", n) + obj)
Carl Friedrich Bolz-Tereick1e9f0932021-04-23 23:27:14 +0200821 self.memoize(obj)
Antoine Pitrou91f43802019-05-26 17:10:09 +0200822 dispatch[bytearray] = save_bytearray
823
Victor Stinner63ab4ba2019-06-13 13:58:51 +0200824 if _HAVE_PICKLE_BUFFER:
825 def save_picklebuffer(self, obj):
826 if self.proto < 5:
827 raise PicklingError("PickleBuffer can only pickled with "
828 "protocol >= 5")
829 with obj.raw() as m:
830 if not m.contiguous:
831 raise PicklingError("PickleBuffer can not be pickled when "
832 "pointing to a non-contiguous buffer")
833 in_band = True
834 if self._buffer_callback is not None:
835 in_band = bool(self._buffer_callback(obj))
836 if in_band:
837 # Write data in-band
838 # XXX The C implementation avoids a copy here
839 if m.readonly:
840 self.save_bytes(m.tobytes())
841 else:
842 self.save_bytearray(m.tobytes())
Antoine Pitrou91f43802019-05-26 17:10:09 +0200843 else:
Victor Stinner63ab4ba2019-06-13 13:58:51 +0200844 # Write data out-of-band
845 self.write(NEXT_BUFFER)
846 if m.readonly:
847 self.write(READONLY_BUFFER)
Antoine Pitrou91f43802019-05-26 17:10:09 +0200848
Victor Stinner63ab4ba2019-06-13 13:58:51 +0200849 dispatch[PickleBuffer] = save_picklebuffer
Antoine Pitrou91f43802019-05-26 17:10:09 +0200850
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300851 def save_str(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000852 if self.bin:
Victor Stinner485fb562010-04-13 11:07:24 +0000853 encoded = obj.encode('utf-8', 'surrogatepass')
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000854 n = len(encoded)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100855 if n <= 0xff and self.proto >= 4:
856 self.write(SHORT_BINUNICODE + pack("<B", n) + encoded)
857 elif n > 0xffffffff and self.proto >= 4:
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100858 self._write_large_bytes(BINUNICODE8 + pack("<Q", n), encoded)
859 elif n >= self.framer._FRAME_SIZE_TARGET:
860 self._write_large_bytes(BINUNICODE + pack("<I", n), encoded)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100861 else:
862 self.write(BINUNICODE + pack("<I", n) + encoded)
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000863 else:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000864 obj = obj.replace("\\", "\\u005c")
Serhiy Storchaka38ab7d42019-05-31 11:29:39 +0300865 obj = obj.replace("\0", "\\u0000")
Guido van Rossum3a41c612003-01-28 15:10:22 +0000866 obj = obj.replace("\n", "\\u000a")
Serhiy Storchaka38ab7d42019-05-31 11:29:39 +0300867 obj = obj.replace("\r", "\\u000d")
868 obj = obj.replace("\x1a", "\\u001a") # EOF on DOS
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100869 self.write(UNICODE + obj.encode('raw-unicode-escape') +
870 b'\n')
Guido van Rossum3a41c612003-01-28 15:10:22 +0000871 self.memoize(obj)
Guido van Rossumf4169812008-03-17 22:56:06 +0000872 dispatch[str] = save_str
Tim Peters658cba62001-02-09 20:06:00 +0000873
Guido van Rossum3a41c612003-01-28 15:10:22 +0000874 def save_tuple(self, obj):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300875 if not obj: # tuple is empty
876 if self.bin:
877 self.write(EMPTY_TUPLE)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000878 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300879 self.write(MARK + TUPLE)
Tim Petersd97da802003-01-28 05:48:29 +0000880 return
881
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300882 n = len(obj)
Tim Petersd97da802003-01-28 05:48:29 +0000883 save = self.save
884 memo = self.memo
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300885 if n <= 3 and self.proto >= 2:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000886 for element in obj:
Tim Petersd97da802003-01-28 05:48:29 +0000887 save(element)
888 # Subtle. Same as in the big comment below.
Guido van Rossum3a41c612003-01-28 15:10:22 +0000889 if id(obj) in memo:
890 get = self.get(memo[id(obj)][0])
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300891 self.write(POP * n + get)
Tim Petersd97da802003-01-28 05:48:29 +0000892 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300893 self.write(_tuplesize2code[n])
Guido van Rossum3a41c612003-01-28 15:10:22 +0000894 self.memoize(obj)
Tim Petersd97da802003-01-28 05:48:29 +0000895 return
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000896
Tim Peters1d63c9f2003-02-02 20:29:39 +0000897 # proto 0 or proto 1 and tuple isn't empty, or proto > 1 and tuple
Tim Petersff57bff2003-01-28 05:34:53 +0000898 # has more than 3 elements.
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300899 write = self.write
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000900 write(MARK)
Guido van Rossum3a41c612003-01-28 15:10:22 +0000901 for element in obj:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000902 save(element)
903
Tim Peters1d63c9f2003-02-02 20:29:39 +0000904 if id(obj) in memo:
Tim Petersf558da02003-01-28 02:09:55 +0000905 # Subtle. d was not in memo when we entered save_tuple(), so
906 # the process of saving the tuple's elements must have saved
907 # the tuple itself: the tuple is recursive. The proper action
908 # now is to throw away everything we put on the stack, and
909 # simply GET the tuple (it's already constructed). This check
910 # could have been done in the "for element" loop instead, but
911 # recursive tuples are a rare thing.
Guido van Rossum3a41c612003-01-28 15:10:22 +0000912 get = self.get(memo[id(obj)][0])
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300913 if self.bin:
Tim Petersf558da02003-01-28 02:09:55 +0000914 write(POP_MARK + get)
915 else: # proto 0 -- POP_MARK not available
Tim Petersd97da802003-01-28 05:48:29 +0000916 write(POP * (n+1) + get)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000917 return
918
Tim Peters1d63c9f2003-02-02 20:29:39 +0000919 # No recursion.
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300920 write(TUPLE)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000921 self.memoize(obj)
Jeremy Hylton3422c992003-01-24 19:29:52 +0000922
Guido van Rossum13257902007-06-07 23:15:56 +0000923 dispatch[tuple] = save_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000924
Guido van Rossum3a41c612003-01-28 15:10:22 +0000925 def save_list(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000926 if self.bin:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300927 self.write(EMPTY_LIST)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000928 else: # proto 0 -- can't use EMPTY_LIST
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300929 self.write(MARK + LIST)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000930
931 self.memoize(obj)
Alexandre Vassalottic7db1d62008-05-14 21:57:18 +0000932 self._batch_appends(obj)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000933
Guido van Rossum13257902007-06-07 23:15:56 +0000934 dispatch[list] = save_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000935
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000936 _BATCHSIZE = 1000
937
938 def _batch_appends(self, items):
939 # Helper to batch up APPENDS sequences
940 save = self.save
941 write = self.write
942
943 if not self.bin:
944 for x in items:
945 save(x)
946 write(APPEND)
947 return
948
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300949 it = iter(items)
950 while True:
951 tmp = list(islice(it, self._BATCHSIZE))
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000952 n = len(tmp)
953 if n > 1:
954 write(MARK)
955 for x in tmp:
956 save(x)
957 write(APPENDS)
958 elif n:
959 save(tmp[0])
960 write(APPEND)
961 # else tmp is empty, and we're done
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300962 if n < self._BATCHSIZE:
963 return
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000964
Guido van Rossum3a41c612003-01-28 15:10:22 +0000965 def save_dict(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000966 if self.bin:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300967 self.write(EMPTY_DICT)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000968 else: # proto 0 -- can't use EMPTY_DICT
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300969 self.write(MARK + DICT)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000970
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000971 self.memoize(obj)
Alexandre Vassalottic7db1d62008-05-14 21:57:18 +0000972 self._batch_setitems(obj.items())
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000973
Guido van Rossum13257902007-06-07 23:15:56 +0000974 dispatch[dict] = save_dict
975 if PyStringMap is not None:
Jeremy Hylton2b9d0291998-05-27 22:38:22 +0000976 dispatch[PyStringMap] = save_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000977
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000978 def _batch_setitems(self, items):
979 # Helper to batch up SETITEMS sequences; proto >= 1 only
980 save = self.save
981 write = self.write
982
983 if not self.bin:
984 for k, v in items:
985 save(k)
986 save(v)
987 write(SETITEM)
988 return
989
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300990 it = iter(items)
991 while True:
992 tmp = list(islice(it, self._BATCHSIZE))
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000993 n = len(tmp)
994 if n > 1:
995 write(MARK)
996 for k, v in tmp:
997 save(k)
998 save(v)
999 write(SETITEMS)
1000 elif n:
1001 k, v = tmp[0]
1002 save(k)
1003 save(v)
1004 write(SETITEM)
1005 # else tmp is empty, and we're done
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001006 if n < self._BATCHSIZE:
1007 return
Guido van Rossum25cb7df2003-01-31 18:53:21 +00001008
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001009 def save_set(self, obj):
1010 save = self.save
1011 write = self.write
1012
1013 if self.proto < 4:
1014 self.save_reduce(set, (list(obj),), obj=obj)
1015 return
1016
1017 write(EMPTY_SET)
1018 self.memoize(obj)
1019
1020 it = iter(obj)
1021 while True:
1022 batch = list(islice(it, self._BATCHSIZE))
1023 n = len(batch)
1024 if n > 0:
1025 write(MARK)
1026 for item in batch:
1027 save(item)
1028 write(ADDITEMS)
1029 if n < self._BATCHSIZE:
1030 return
1031 dispatch[set] = save_set
1032
1033 def save_frozenset(self, obj):
1034 save = self.save
1035 write = self.write
1036
1037 if self.proto < 4:
1038 self.save_reduce(frozenset, (list(obj),), obj=obj)
1039 return
1040
1041 write(MARK)
1042 for item in obj:
1043 save(item)
1044
1045 if id(obj) in self.memo:
1046 # If the object is already in the memo, this means it is
1047 # recursive. In this case, throw away everything we put on the
1048 # stack, and fetch the object back from the memo.
1049 write(POP_MARK + self.get(self.memo[id(obj)][0]))
1050 return
1051
1052 write(FROZENSET)
1053 self.memoize(obj)
1054 dispatch[frozenset] = save_frozenset
1055
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001056 def save_global(self, obj, name=None):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001057 write = self.write
1058 memo = self.memo
1059
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001060 if name is None:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001061 name = getattr(obj, '__qualname__', None)
Tim Petersc32d8242001-04-10 02:48:53 +00001062 if name is None:
Guido van Rossum3a41c612003-01-28 15:10:22 +00001063 name = obj.__name__
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001064
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001065 module_name = whichmodule(obj, name)
Guido van Rossumb0a98e92001-08-17 18:49:52 +00001066 try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001067 __import__(module_name, level=0)
1068 module = sys.modules[module_name]
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001069 obj2, parent = _getattribute(module, name)
Guido van Rossumb0a98e92001-08-17 18:49:52 +00001070 except (ImportError, KeyError, AttributeError):
1071 raise PicklingError(
1072 "Can't pickle %r: it's not found as %s.%s" %
Serhiy Storchaka5affd232017-04-05 09:37:24 +03001073 (obj, module_name, name)) from None
Guido van Rossumb0a98e92001-08-17 18:49:52 +00001074 else:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001075 if obj2 is not obj:
Guido van Rossumb0a98e92001-08-17 18:49:52 +00001076 raise PicklingError(
1077 "Can't pickle %r: it's not the same object as %s.%s" %
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001078 (obj, module_name, name))
Guido van Rossumb0a98e92001-08-17 18:49:52 +00001079
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001080 if self.proto >= 2:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001081 code = _extension_registry.get((module_name, name))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001082 if code:
1083 assert code > 0
1084 if code <= 0xff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001085 write(EXT1 + pack("<B", code))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001086 elif code <= 0xffff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001087 write(EXT2 + pack("<H", code))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001088 else:
1089 write(EXT4 + pack("<i", code))
1090 return
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001091 lastname = name.rpartition('.')[2]
1092 if parent is module:
1093 name = lastname
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001094 # Non-ASCII identifiers are supported only with protocols >= 3.
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001095 if self.proto >= 4:
1096 self.save(module_name)
1097 self.save(name)
1098 write(STACK_GLOBAL)
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001099 elif parent is not module:
1100 self.save_reduce(getattr, (parent, lastname))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001101 elif self.proto >= 3:
1102 write(GLOBAL + bytes(module_name, "utf-8") + b'\n' +
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001103 bytes(name, "utf-8") + b'\n')
1104 else:
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001105 if self.fix_imports:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001106 r_name_mapping = _compat_pickle.REVERSE_NAME_MAPPING
1107 r_import_mapping = _compat_pickle.REVERSE_IMPORT_MAPPING
1108 if (module_name, name) in r_name_mapping:
1109 module_name, name = r_name_mapping[(module_name, name)]
Serhiy Storchakabfe18242015-03-31 13:12:37 +03001110 elif module_name in r_import_mapping:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001111 module_name = r_import_mapping[module_name]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001112 try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001113 write(GLOBAL + bytes(module_name, "ascii") + b'\n' +
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001114 bytes(name, "ascii") + b'\n')
1115 except UnicodeEncodeError:
1116 raise PicklingError(
1117 "can't pickle global identifier '%s.%s' using "
Serhiy Storchaka5affd232017-04-05 09:37:24 +03001118 "pickle protocol %i" % (module, name, self.proto)) from None
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001119
Guido van Rossum3a41c612003-01-28 15:10:22 +00001120 self.memoize(obj)
Tim Peters3b769832003-01-28 03:51:36 +00001121
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08001122 def save_type(self, obj):
1123 if obj is type(None):
1124 return self.save_reduce(type, (None,), obj=obj)
1125 elif obj is type(NotImplemented):
1126 return self.save_reduce(type, (NotImplemented,), obj=obj)
1127 elif obj is type(...):
1128 return self.save_reduce(type, (...,), obj=obj)
1129 return self.save_global(obj)
1130
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001131 dispatch[FunctionType] = save_global
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08001132 dispatch[type] = save_type
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001133
Guido van Rossuma48061a1995-01-10 00:31:14 +00001134
Guido van Rossum1be31752003-01-28 15:19:53 +00001135# Unpickling machinery
1136
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001137class _Unpickler:
Guido van Rossuma48061a1995-01-10 00:31:14 +00001138
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001139 def __init__(self, file, *, fix_imports=True,
Antoine Pitrou91f43802019-05-26 17:10:09 +02001140 encoding="ASCII", errors="strict", buffers=None):
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001141 """This takes a binary file for reading a pickle data stream.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001142
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001143 The protocol version of the pickle is detected automatically, so
1144 no proto argument is needed.
1145
1146 The argument *file* must have two methods, a read() method that
1147 takes an integer argument, and a readline() method that requires
1148 no arguments. Both methods should return bytes. Thus *file*
Martin Panter7462b6492015-11-02 03:37:02 +00001149 can be a binary file object opened for reading, an io.BytesIO
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001150 object, or any other custom object that meets this interface.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001151
Guido van Rossumfeea0782007-10-10 18:00:50 +00001152 The file-like object must have two methods, a read() method
1153 that takes an integer argument, and a readline() method that
1154 requires no arguments. Both methods should return bytes.
1155 Thus file-like object can be a binary file object opened for
1156 reading, a BytesIO object, or any other custom object that
1157 meets this interface.
Guido van Rossumf4169812008-03-17 22:56:06 +00001158
Antoine Pitrou91f43802019-05-26 17:10:09 +02001159 If *buffers* is not None, it should be an iterable of buffer-enabled
1160 objects that is consumed each time the pickle stream references
1161 an out-of-band buffer view. Such buffers have been given in order
1162 to the *buffer_callback* of a Pickler object.
1163
1164 If *buffers* is None (the default), then the buffers are taken
1165 from the pickle stream, assuming they are serialized there.
1166 It is an error for *buffers* to be None if the pickle stream
1167 was produced with a non-None *buffer_callback*.
1168
1169 Other optional arguments are *fix_imports*, *encoding* and
Martin Panter46f50722016-05-26 05:35:26 +00001170 *errors*, which are used to control compatibility support for
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001171 pickle stream generated by Python 2. If *fix_imports* is True,
1172 pickle will try to map the old Python 2 names to the new names
1173 used in Python 3. The *encoding* and *errors* tell pickle how
1174 to decode 8-bit string instances pickled by Python 2; these
1175 default to 'ASCII' and 'strict', respectively. *encoding* can be
1176 'bytes' to read theses 8-bit string instances as bytes objects.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001177 """
Antoine Pitrou91f43802019-05-26 17:10:09 +02001178 self._buffers = iter(buffers) if buffers is not None else None
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001179 self._file_readline = file.readline
1180 self._file_read = file.read
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001181 self.memo = {}
Guido van Rossumf4169812008-03-17 22:56:06 +00001182 self.encoding = encoding
1183 self.errors = errors
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001184 self.proto = 0
1185 self.fix_imports = fix_imports
Guido van Rossuma48061a1995-01-10 00:31:14 +00001186
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001187 def load(self):
Guido van Rossum3a41c612003-01-28 15:10:22 +00001188 """Read a pickled object representation from the open file.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001189
Guido van Rossum3a41c612003-01-28 15:10:22 +00001190 Return the reconstituted object hierarchy specified in the file.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001191 """
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +00001192 # Check whether Unpickler was initialized correctly. This is
1193 # only needed to mimic the behavior of _pickle.Unpickler.dump().
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001194 if not hasattr(self, "_file_read"):
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +00001195 raise UnpicklingError("Unpickler.__init__() was not called by "
1196 "%s.__init__()" % (self.__class__.__name__,))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001197 self._unframer = _Unframer(self._file_read, self._file_readline)
1198 self.read = self._unframer.read
Antoine Pitrou91f43802019-05-26 17:10:09 +02001199 self.readinto = self._unframer.readinto
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001200 self.readline = self._unframer.readline
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001201 self.metastack = []
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001202 self.stack = []
1203 self.append = self.stack.append
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001204 self.proto = 0
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001205 read = self.read
1206 dispatch = self.dispatch
1207 try:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001208 while True:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001209 key = read(1)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001210 if not key:
1211 raise EOFError
Guido van Rossum98297ee2007-11-06 21:34:58 +00001212 assert isinstance(key, bytes_types)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001213 dispatch[key[0]](self)
Guido van Rossumb940e112007-01-10 16:19:56 +00001214 except _Stop as stopinst:
Guido van Rossumff871742000-12-13 18:11:56 +00001215 return stopinst.value
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001216
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001217 # Return a list of items pushed in the stack after last MARK instruction.
1218 def pop_mark(self):
1219 items = self.stack
1220 self.stack = self.metastack.pop()
1221 self.append = self.stack.append
1222 return items
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001223
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001224 def persistent_load(self, pid):
Benjamin Peterson49956b22009-01-10 17:05:44 +00001225 raise UnpicklingError("unsupported persistent id encountered")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001226
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001227 dispatch = {}
1228
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001229 def load_proto(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001230 proto = self.read(1)[0]
Guido van Rossumf4169812008-03-17 22:56:06 +00001231 if not 0 <= proto <= HIGHEST_PROTOCOL:
Guido van Rossum26d95c32007-08-27 23:18:54 +00001232 raise ValueError("unsupported pickle protocol: %d" % proto)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001233 self.proto = proto
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001234 dispatch[PROTO[0]] = load_proto
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001235
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08001236 def load_frame(self):
1237 frame_size, = unpack('<Q', self.read(8))
1238 if frame_size > sys.maxsize:
1239 raise ValueError("frame size > sys.maxsize: %d" % frame_size)
1240 self._unframer.load_frame(frame_size)
1241 dispatch[FRAME[0]] = load_frame
1242
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001243 def load_persid(self):
Serhiy Storchakadec25af2016-07-17 11:24:17 +03001244 try:
1245 pid = self.readline()[:-1].decode("ascii")
1246 except UnicodeDecodeError:
1247 raise UnpicklingError(
1248 "persistent IDs in protocol 0 must be ASCII strings")
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001249 self.append(self.persistent_load(pid))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001250 dispatch[PERSID[0]] = load_persid
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001251
1252 def load_binpersid(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001253 pid = self.stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001254 self.append(self.persistent_load(pid))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001255 dispatch[BINPERSID[0]] = load_binpersid
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001256
1257 def load_none(self):
1258 self.append(None)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001259 dispatch[NONE[0]] = load_none
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001260
Guido van Rossum7d97d312003-01-28 04:25:27 +00001261 def load_false(self):
1262 self.append(False)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001263 dispatch[NEWFALSE[0]] = load_false
Guido van Rossum7d97d312003-01-28 04:25:27 +00001264
1265 def load_true(self):
1266 self.append(True)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001267 dispatch[NEWTRUE[0]] = load_true
Guido van Rossum7d97d312003-01-28 04:25:27 +00001268
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001269 def load_int(self):
Tim Peters19ef62d2001-08-28 22:21:18 +00001270 data = self.readline()
Guido van Rossume2763392002-04-05 19:30:08 +00001271 if data == FALSE[1:]:
1272 val = False
1273 elif data == TRUE[1:]:
1274 val = True
1275 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001276 val = int(data, 0)
Guido van Rossume2763392002-04-05 19:30:08 +00001277 self.append(val)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001278 dispatch[INT[0]] = load_int
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001279
1280 def load_binint(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001281 self.append(unpack('<i', self.read(4))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001282 dispatch[BININT[0]] = load_binint
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001283
1284 def load_binint1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001285 self.append(self.read(1)[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001286 dispatch[BININT1[0]] = load_binint1
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001287
1288 def load_binint2(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001289 self.append(unpack('<H', self.read(2))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001290 dispatch[BININT2[0]] = load_binint2
Tim Peters2344fae2001-01-15 00:50:52 +00001291
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001292 def load_long(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001293 val = self.readline()[:-1]
1294 if val and val[-1] == b'L'[0]:
Mark Dickinson8dd05142009-01-20 20:43:58 +00001295 val = val[:-1]
Guido van Rossumfeea0782007-10-10 18:00:50 +00001296 self.append(int(val, 0))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001297 dispatch[LONG[0]] = load_long
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001298
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001299 def load_long1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001300 n = self.read(1)[0]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001301 data = self.read(n)
1302 self.append(decode_long(data))
1303 dispatch[LONG1[0]] = load_long1
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001304
1305 def load_long4(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001306 n, = unpack('<i', self.read(4))
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001307 if n < 0:
1308 # Corrupt or hostile pickle -- we never write one like this
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001309 raise UnpicklingError("LONG pickle has negative byte count")
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001310 data = self.read(n)
1311 self.append(decode_long(data))
1312 dispatch[LONG4[0]] = load_long4
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001313
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001314 def load_float(self):
Guido van Rossumff871742000-12-13 18:11:56 +00001315 self.append(float(self.readline()[:-1]))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001316 dispatch[FLOAT[0]] = load_float
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001317
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001318 def load_binfloat(self):
Guido van Rossumd3703791998-10-22 20:15:36 +00001319 self.append(unpack('>d', self.read(8))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001320 dispatch[BINFLOAT[0]] = load_binfloat
Guido van Rossumd3703791998-10-22 20:15:36 +00001321
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001322 def _decode_string(self, value):
1323 # Used to allow strings from Python 2 to be decoded either as
1324 # bytes or Unicode strings. This should be used only with the
1325 # STRING, BINSTRING and SHORT_BINSTRING opcodes.
1326 if self.encoding == "bytes":
1327 return value
1328 else:
1329 return value.decode(self.encoding, self.errors)
1330
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001331 def load_string(self):
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001332 data = self.readline()[:-1]
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001333 # Strip outermost quotes
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001334 if len(data) >= 2 and data[0] == data[-1] and data[0] in b'"\'':
1335 data = data[1:-1]
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001336 else:
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001337 raise UnpicklingError("the STRING opcode argument must be quoted")
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001338 self.append(self._decode_string(codecs.escape_decode(data)[0]))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001339 dispatch[STRING[0]] = load_string
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001340
1341 def load_binstring(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001342 # Deprecated BINSTRING uses signed 32-bit length
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001343 len, = unpack('<i', self.read(4))
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001344 if len < 0:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001345 raise UnpicklingError("BINSTRING pickle has negative byte count")
Guido van Rossumf4169812008-03-17 22:56:06 +00001346 data = self.read(len)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001347 self.append(self._decode_string(data))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001348 dispatch[BINSTRING[0]] = load_binstring
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001349
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001350 def load_binbytes(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001351 len, = unpack('<I', self.read(4))
1352 if len > maxsize:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001353 raise UnpicklingError("BINBYTES exceeds system's maximum size "
1354 "of %d bytes" % maxsize)
Guido van Rossumf4169812008-03-17 22:56:06 +00001355 self.append(self.read(len))
1356 dispatch[BINBYTES[0]] = load_binbytes
1357
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001358 def load_unicode(self):
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001359 self.append(str(self.readline()[:-1], 'raw-unicode-escape'))
1360 dispatch[UNICODE[0]] = load_unicode
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001361
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001362 def load_binunicode(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001363 len, = unpack('<I', self.read(4))
1364 if len > maxsize:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001365 raise UnpicklingError("BINUNICODE exceeds system's maximum size "
1366 "of %d bytes" % maxsize)
Victor Stinner485fb562010-04-13 11:07:24 +00001367 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001368 dispatch[BINUNICODE[0]] = load_binunicode
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001369
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001370 def load_binunicode8(self):
1371 len, = unpack('<Q', self.read(8))
1372 if len > maxsize:
1373 raise UnpicklingError("BINUNICODE8 exceeds system's maximum size "
1374 "of %d bytes" % maxsize)
1375 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
1376 dispatch[BINUNICODE8[0]] = load_binunicode8
1377
Serhiy Storchakae0606192015-09-29 22:10:07 +03001378 def load_binbytes8(self):
1379 len, = unpack('<Q', self.read(8))
1380 if len > maxsize:
1381 raise UnpicklingError("BINBYTES8 exceeds system's maximum size "
1382 "of %d bytes" % maxsize)
1383 self.append(self.read(len))
1384 dispatch[BINBYTES8[0]] = load_binbytes8
1385
Antoine Pitrou91f43802019-05-26 17:10:09 +02001386 def load_bytearray8(self):
1387 len, = unpack('<Q', self.read(8))
1388 if len > maxsize:
1389 raise UnpicklingError("BYTEARRAY8 exceeds system's maximum size "
1390 "of %d bytes" % maxsize)
1391 b = bytearray(len)
1392 self.readinto(b)
1393 self.append(b)
1394 dispatch[BYTEARRAY8[0]] = load_bytearray8
1395
1396 def load_next_buffer(self):
1397 if self._buffers is None:
1398 raise UnpicklingError("pickle stream refers to out-of-band data "
1399 "but no *buffers* argument was given")
1400 try:
1401 buf = next(self._buffers)
1402 except StopIteration:
1403 raise UnpicklingError("not enough out-of-band buffers")
1404 self.append(buf)
1405 dispatch[NEXT_BUFFER[0]] = load_next_buffer
1406
1407 def load_readonly_buffer(self):
1408 buf = self.stack[-1]
1409 with memoryview(buf) as m:
1410 if not m.readonly:
1411 self.stack[-1] = m.toreadonly()
1412 dispatch[READONLY_BUFFER[0]] = load_readonly_buffer
1413
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001414 def load_short_binstring(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001415 len = self.read(1)[0]
1416 data = self.read(len)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001417 self.append(self._decode_string(data))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001418 dispatch[SHORT_BINSTRING[0]] = load_short_binstring
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001419
Guido van Rossumf4169812008-03-17 22:56:06 +00001420 def load_short_binbytes(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001421 len = self.read(1)[0]
1422 self.append(self.read(len))
Guido van Rossumf4169812008-03-17 22:56:06 +00001423 dispatch[SHORT_BINBYTES[0]] = load_short_binbytes
1424
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001425 def load_short_binunicode(self):
1426 len = self.read(1)[0]
1427 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
1428 dispatch[SHORT_BINUNICODE[0]] = load_short_binunicode
1429
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001430 def load_tuple(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001431 items = self.pop_mark()
1432 self.append(tuple(items))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001433 dispatch[TUPLE[0]] = load_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001434
1435 def load_empty_tuple(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001436 self.append(())
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001437 dispatch[EMPTY_TUPLE[0]] = load_empty_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001438
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001439 def load_tuple1(self):
1440 self.stack[-1] = (self.stack[-1],)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001441 dispatch[TUPLE1[0]] = load_tuple1
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001442
1443 def load_tuple2(self):
1444 self.stack[-2:] = [(self.stack[-2], self.stack[-1])]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001445 dispatch[TUPLE2[0]] = load_tuple2
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001446
1447 def load_tuple3(self):
1448 self.stack[-3:] = [(self.stack[-3], self.stack[-2], self.stack[-1])]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001449 dispatch[TUPLE3[0]] = load_tuple3
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001450
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001451 def load_empty_list(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001452 self.append([])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001453 dispatch[EMPTY_LIST[0]] = load_empty_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001454
1455 def load_empty_dictionary(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001456 self.append({})
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001457 dispatch[EMPTY_DICT[0]] = load_empty_dictionary
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001458
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001459 def load_empty_set(self):
1460 self.append(set())
1461 dispatch[EMPTY_SET[0]] = load_empty_set
1462
1463 def load_frozenset(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001464 items = self.pop_mark()
1465 self.append(frozenset(items))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001466 dispatch[FROZENSET[0]] = load_frozenset
1467
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001468 def load_list(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001469 items = self.pop_mark()
1470 self.append(items)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001471 dispatch[LIST[0]] = load_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001472
1473 def load_dict(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001474 items = self.pop_mark()
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001475 d = {items[i]: items[i+1]
1476 for i in range(0, len(items), 2)}
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001477 self.append(d)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001478 dispatch[DICT[0]] = load_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001479
Tim Petersd01c1e92003-01-30 15:41:46 +00001480 # INST and OBJ differ only in how they get a class object. It's not
1481 # only sensible to do the rest in a common routine, the two routines
1482 # previously diverged and grew different bugs.
1483 # klass is the class to instantiate, and k points to the topmost mark
1484 # object, following which are the arguments for klass.__init__.
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001485 def _instantiate(self, klass, args):
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00001486 if (args or not isinstance(klass, type) or
1487 hasattr(klass, "__getinitargs__")):
Guido van Rossum743d17e1998-09-15 20:25:57 +00001488 try:
Guido van Rossumb26a97a2003-01-28 22:29:13 +00001489 value = klass(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +00001490 except TypeError as err:
Guido van Rossum26d95c32007-08-27 23:18:54 +00001491 raise TypeError("in constructor for %s: %s" %
1492 (klass.__name__, str(err)), sys.exc_info()[2])
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00001493 else:
1494 value = klass.__new__(klass)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001495 self.append(value)
Tim Petersd01c1e92003-01-30 15:41:46 +00001496
1497 def load_inst(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001498 module = self.readline()[:-1].decode("ascii")
1499 name = self.readline()[:-1].decode("ascii")
Tim Petersd01c1e92003-01-30 15:41:46 +00001500 klass = self.find_class(module, name)
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001501 self._instantiate(klass, self.pop_mark())
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001502 dispatch[INST[0]] = load_inst
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001503
1504 def load_obj(self):
Tim Petersd01c1e92003-01-30 15:41:46 +00001505 # Stack is ... markobject classobject arg1 arg2 ...
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001506 args = self.pop_mark()
1507 cls = args.pop(0)
1508 self._instantiate(cls, args)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001509 dispatch[OBJ[0]] = load_obj
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001510
Guido van Rossum3a41c612003-01-28 15:10:22 +00001511 def load_newobj(self):
1512 args = self.stack.pop()
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001513 cls = self.stack.pop()
Guido van Rossum3a41c612003-01-28 15:10:22 +00001514 obj = cls.__new__(cls, *args)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001515 self.append(obj)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001516 dispatch[NEWOBJ[0]] = load_newobj
Guido van Rossum3a41c612003-01-28 15:10:22 +00001517
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001518 def load_newobj_ex(self):
1519 kwargs = self.stack.pop()
1520 args = self.stack.pop()
1521 cls = self.stack.pop()
1522 obj = cls.__new__(cls, *args, **kwargs)
1523 self.append(obj)
1524 dispatch[NEWOBJ_EX[0]] = load_newobj_ex
1525
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001526 def load_global(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001527 module = self.readline()[:-1].decode("utf-8")
1528 name = self.readline()[:-1].decode("utf-8")
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001529 klass = self.find_class(module, name)
1530 self.append(klass)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001531 dispatch[GLOBAL[0]] = load_global
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001532
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001533 def load_stack_global(self):
1534 name = self.stack.pop()
1535 module = self.stack.pop()
1536 if type(name) is not str or type(module) is not str:
1537 raise UnpicklingError("STACK_GLOBAL requires str")
1538 self.append(self.find_class(module, name))
1539 dispatch[STACK_GLOBAL[0]] = load_stack_global
1540
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001541 def load_ext1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001542 code = self.read(1)[0]
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001543 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001544 dispatch[EXT1[0]] = load_ext1
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001545
1546 def load_ext2(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001547 code, = unpack('<H', self.read(2))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001548 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001549 dispatch[EXT2[0]] = load_ext2
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001550
1551 def load_ext4(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001552 code, = unpack('<i', self.read(4))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001553 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001554 dispatch[EXT4[0]] = load_ext4
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001555
1556 def get_extension(self, code):
1557 nil = []
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001558 obj = _extension_cache.get(code, nil)
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001559 if obj is not nil:
1560 self.append(obj)
1561 return
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001562 key = _inverted_registry.get(code)
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001563 if not key:
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001564 if code <= 0: # note that 0 is forbidden
1565 # Corrupt or hostile pickle.
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001566 raise UnpicklingError("EXT specifies code <= 0")
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001567 raise ValueError("unregistered extension code %d" % code)
1568 obj = self.find_class(*key)
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001569 _extension_cache[code] = obj
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001570 self.append(obj)
1571
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001572 def find_class(self, module, name):
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001573 # Subclasses may override this.
Steve Dowerb82e17e2019-05-23 08:45:22 -07001574 sys.audit('pickle.find_class', module, name)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001575 if self.proto < 3 and self.fix_imports:
1576 if (module, name) in _compat_pickle.NAME_MAPPING:
1577 module, name = _compat_pickle.NAME_MAPPING[(module, name)]
Serhiy Storchakabfe18242015-03-31 13:12:37 +03001578 elif module in _compat_pickle.IMPORT_MAPPING:
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001579 module = _compat_pickle.IMPORT_MAPPING[module]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001580 __import__(module, level=0)
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001581 if self.proto >= 4:
1582 return _getattribute(sys.modules[module], name)[0]
1583 else:
1584 return getattr(sys.modules[module], name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001585
1586 def load_reduce(self):
1587 stack = self.stack
Guido van Rossumb26a97a2003-01-28 22:29:13 +00001588 args = stack.pop()
1589 func = stack[-1]
Serhiy Storchakaa8d83f52015-12-01 00:39:25 +02001590 stack[-1] = func(*args)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001591 dispatch[REDUCE[0]] = load_reduce
Guido van Rossuma48061a1995-01-10 00:31:14 +00001592
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001593 def load_pop(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001594 if self.stack:
1595 del self.stack[-1]
1596 else:
1597 self.pop_mark()
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001598 dispatch[POP[0]] = load_pop
Guido van Rossum7b5430f1995-03-04 22:25:21 +00001599
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001600 def load_pop_mark(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001601 self.pop_mark()
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001602 dispatch[POP_MARK[0]] = load_pop_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +00001603
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001604 def load_dup(self):
Guido van Rossumb1062fc1998-03-31 17:00:46 +00001605 self.append(self.stack[-1])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001606 dispatch[DUP[0]] = load_dup
Guido van Rossuma48061a1995-01-10 00:31:14 +00001607
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001608 def load_get(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001609 i = int(self.readline()[:-1])
Claudiu Popa6f03b232019-11-24 20:15:08 +01001610 try:
1611 self.append(self.memo[i])
1612 except KeyError:
1613 msg = f'Memo value not found at index {i}'
1614 raise UnpicklingError(msg) from None
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001615 dispatch[GET[0]] = load_get
Guido van Rossum78536471996-04-12 13:36:27 +00001616
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001617 def load_binget(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001618 i = self.read(1)[0]
Claudiu Popa6f03b232019-11-24 20:15:08 +01001619 try:
1620 self.append(self.memo[i])
1621 except KeyError as exc:
1622 msg = f'Memo value not found at index {i}'
1623 raise UnpicklingError(msg) from None
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001624 dispatch[BINGET[0]] = load_binget
Guido van Rossum78536471996-04-12 13:36:27 +00001625
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001626 def load_long_binget(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001627 i, = unpack('<I', self.read(4))
Claudiu Popa6f03b232019-11-24 20:15:08 +01001628 try:
1629 self.append(self.memo[i])
1630 except KeyError as exc:
1631 msg = f'Memo value not found at index {i}'
1632 raise UnpicklingError(msg) from None
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001633 dispatch[LONG_BINGET[0]] = load_long_binget
Guido van Rossum78536471996-04-12 13:36:27 +00001634
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001635 def load_put(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001636 i = int(self.readline()[:-1])
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001637 if i < 0:
1638 raise ValueError("negative PUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001639 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001640 dispatch[PUT[0]] = load_put
Guido van Rossuma48061a1995-01-10 00:31:14 +00001641
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001642 def load_binput(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001643 i = self.read(1)[0]
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001644 if i < 0:
1645 raise ValueError("negative BINPUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001646 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001647 dispatch[BINPUT[0]] = load_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +00001648
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001649 def load_long_binput(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001650 i, = unpack('<I', self.read(4))
1651 if i > maxsize:
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001652 raise ValueError("negative LONG_BINPUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001653 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001654 dispatch[LONG_BINPUT[0]] = load_long_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +00001655
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001656 def load_memoize(self):
1657 memo = self.memo
1658 memo[len(memo)] = self.stack[-1]
1659 dispatch[MEMOIZE[0]] = load_memoize
1660
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001661 def load_append(self):
1662 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001663 value = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001664 list = stack[-1]
1665 list.append(value)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001666 dispatch[APPEND[0]] = load_append
Guido van Rossuma48061a1995-01-10 00:31:14 +00001667
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001668 def load_appends(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001669 items = self.pop_mark()
1670 list_obj = self.stack[-1]
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02001671 try:
1672 extend = list_obj.extend
1673 except AttributeError:
1674 pass
Alexandre Vassalotti1f7492c2013-04-20 13:19:46 -07001675 else:
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02001676 extend(items)
1677 return
1678 # Even if the PEP 307 requires extend() and append() methods,
1679 # fall back on append() if the object has no extend() method
1680 # for backward compatibility.
1681 append = list_obj.append
1682 for item in items:
1683 append(item)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001684 dispatch[APPENDS[0]] = load_appends
Tim Peters2344fae2001-01-15 00:50:52 +00001685
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001686 def load_setitem(self):
1687 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001688 value = stack.pop()
1689 key = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001690 dict = stack[-1]
1691 dict[key] = value
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001692 dispatch[SETITEM[0]] = load_setitem
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001693
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001694 def load_setitems(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001695 items = self.pop_mark()
1696 dict = self.stack[-1]
1697 for i in range(0, len(items), 2):
1698 dict[items[i]] = items[i + 1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001699 dispatch[SETITEMS[0]] = load_setitems
Guido van Rossuma48061a1995-01-10 00:31:14 +00001700
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001701 def load_additems(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001702 items = self.pop_mark()
1703 set_obj = self.stack[-1]
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001704 if isinstance(set_obj, set):
1705 set_obj.update(items)
1706 else:
1707 add = set_obj.add
1708 for item in items:
1709 add(item)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001710 dispatch[ADDITEMS[0]] = load_additems
1711
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001712 def load_build(self):
1713 stack = self.stack
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001714 state = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001715 inst = stack[-1]
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001716 setstate = getattr(inst, "__setstate__", None)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001717 if setstate is not None:
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001718 setstate(state)
1719 return
1720 slotstate = None
1721 if isinstance(state, tuple) and len(state) == 2:
1722 state, slotstate = state
1723 if state:
Alexandre Vassalottiebfecfd2009-05-25 18:50:33 +00001724 inst_dict = inst.__dict__
Antoine Pitroua9f48a02009-05-02 21:41:14 +00001725 intern = sys.intern
Alexandre Vassalottiebfecfd2009-05-25 18:50:33 +00001726 for k, v in state.items():
1727 if type(k) is str:
1728 inst_dict[intern(k)] = v
1729 else:
1730 inst_dict[k] = v
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001731 if slotstate:
1732 for k, v in slotstate.items():
1733 setattr(inst, k, v)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001734 dispatch[BUILD[0]] = load_build
Guido van Rossuma48061a1995-01-10 00:31:14 +00001735
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001736 def load_mark(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001737 self.metastack.append(self.stack)
1738 self.stack = []
1739 self.append = self.stack.append
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001740 dispatch[MARK[0]] = load_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +00001741
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001742 def load_stop(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001743 value = self.stack.pop()
Guido van Rossumff871742000-12-13 18:11:56 +00001744 raise _Stop(value)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001745 dispatch[STOP[0]] = load_stop
Guido van Rossuma48061a1995-01-10 00:31:14 +00001746
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001747
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001748# Shorthands
1749
Antoine Pitrou91f43802019-05-26 17:10:09 +02001750def _dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None):
1751 _Pickler(file, protocol, fix_imports=fix_imports,
1752 buffer_callback=buffer_callback).dump(obj)
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001753
Antoine Pitrou91f43802019-05-26 17:10:09 +02001754def _dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None):
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001755 f = io.BytesIO()
Antoine Pitrou91f43802019-05-26 17:10:09 +02001756 _Pickler(f, protocol, fix_imports=fix_imports,
1757 buffer_callback=buffer_callback).dump(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001758 res = f.getvalue()
Guido van Rossum98297ee2007-11-06 21:34:58 +00001759 assert isinstance(res, bytes_types)
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001760 return res
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001761
Antoine Pitrou91f43802019-05-26 17:10:09 +02001762def _load(file, *, fix_imports=True, encoding="ASCII", errors="strict",
1763 buffers=None):
1764 return _Unpickler(file, fix_imports=fix_imports, buffers=buffers,
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001765 encoding=encoding, errors=errors).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001766
Serhiy Storchaka531d1e52020-05-02 09:38:01 +03001767def _loads(s, /, *, fix_imports=True, encoding="ASCII", errors="strict",
Antoine Pitrou91f43802019-05-26 17:10:09 +02001768 buffers=None):
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001769 if isinstance(s, str):
1770 raise TypeError("Can't load pickle from unicode string")
1771 file = io.BytesIO(s)
Antoine Pitrou91f43802019-05-26 17:10:09 +02001772 return _Unpickler(file, fix_imports=fix_imports, buffers=buffers,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001773 encoding=encoding, errors=errors).load()
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001774
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001775# Use the faster _pickle if possible
1776try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001777 from _pickle import (
1778 PickleError,
1779 PicklingError,
1780 UnpicklingError,
1781 Pickler,
1782 Unpickler,
1783 dump,
1784 dumps,
1785 load,
1786 loads
1787 )
Brett Cannoncd171c82013-07-04 17:43:24 -04001788except ImportError:
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001789 Pickler, Unpickler = _Pickler, _Unpickler
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001790 dump, dumps, load, loads = _dump, _dumps, _load, _loads
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001791
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001792# Doctest
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001793def _test():
1794 import doctest
1795 return doctest.testmod()
1796
1797if __name__ == "__main__":
Florent Xicluna54540ec2011-11-04 08:29:17 +01001798 import argparse
Alexander Belopolsky455f7bd2010-07-27 23:02:38 +00001799 parser = argparse.ArgumentParser(
1800 description='display contents of the pickle files')
1801 parser.add_argument(
1802 'pickle_file', type=argparse.FileType('br'),
1803 nargs='*', help='the pickle file')
1804 parser.add_argument(
1805 '-t', '--test', action='store_true',
1806 help='run self-test suite')
1807 parser.add_argument(
1808 '-v', action='store_true',
1809 help='run verbosely; only affects self-test run')
1810 args = parser.parse_args()
1811 if args.test:
1812 _test()
1813 else:
1814 if not args.pickle_file:
1815 parser.print_help()
1816 else:
1817 import pprint
1818 for f in args.pickle_file:
1819 obj = load(f)
1820 pprint.pprint(obj)