blob: e63a8b6e4dbb7006cc1383f43b26e61b3c90db79 [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)
821 dispatch[bytearray] = save_bytearray
822
Victor Stinner63ab4ba2019-06-13 13:58:51 +0200823 if _HAVE_PICKLE_BUFFER:
824 def save_picklebuffer(self, obj):
825 if self.proto < 5:
826 raise PicklingError("PickleBuffer can only pickled with "
827 "protocol >= 5")
828 with obj.raw() as m:
829 if not m.contiguous:
830 raise PicklingError("PickleBuffer can not be pickled when "
831 "pointing to a non-contiguous buffer")
832 in_band = True
833 if self._buffer_callback is not None:
834 in_band = bool(self._buffer_callback(obj))
835 if in_band:
836 # Write data in-band
837 # XXX The C implementation avoids a copy here
838 if m.readonly:
839 self.save_bytes(m.tobytes())
840 else:
841 self.save_bytearray(m.tobytes())
Antoine Pitrou91f43802019-05-26 17:10:09 +0200842 else:
Victor Stinner63ab4ba2019-06-13 13:58:51 +0200843 # Write data out-of-band
844 self.write(NEXT_BUFFER)
845 if m.readonly:
846 self.write(READONLY_BUFFER)
Antoine Pitrou91f43802019-05-26 17:10:09 +0200847
Victor Stinner63ab4ba2019-06-13 13:58:51 +0200848 dispatch[PickleBuffer] = save_picklebuffer
Antoine Pitrou91f43802019-05-26 17:10:09 +0200849
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300850 def save_str(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000851 if self.bin:
Victor Stinner485fb562010-04-13 11:07:24 +0000852 encoded = obj.encode('utf-8', 'surrogatepass')
Guido van Rossum2e6a4b32007-05-04 19:56:22 +0000853 n = len(encoded)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100854 if n <= 0xff and self.proto >= 4:
855 self.write(SHORT_BINUNICODE + pack("<B", n) + encoded)
856 elif n > 0xffffffff and self.proto >= 4:
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +0100857 self._write_large_bytes(BINUNICODE8 + pack("<Q", n), encoded)
858 elif n >= self.framer._FRAME_SIZE_TARGET:
859 self._write_large_bytes(BINUNICODE + pack("<I", n), encoded)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100860 else:
861 self.write(BINUNICODE + pack("<I", n) + encoded)
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +0000862 else:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000863 obj = obj.replace("\\", "\\u005c")
Serhiy Storchaka38ab7d42019-05-31 11:29:39 +0300864 obj = obj.replace("\0", "\\u0000")
Guido van Rossum3a41c612003-01-28 15:10:22 +0000865 obj = obj.replace("\n", "\\u000a")
Serhiy Storchaka38ab7d42019-05-31 11:29:39 +0300866 obj = obj.replace("\r", "\\u000d")
867 obj = obj.replace("\x1a", "\\u001a") # EOF on DOS
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +0100868 self.write(UNICODE + obj.encode('raw-unicode-escape') +
869 b'\n')
Guido van Rossum3a41c612003-01-28 15:10:22 +0000870 self.memoize(obj)
Guido van Rossumf4169812008-03-17 22:56:06 +0000871 dispatch[str] = save_str
Tim Peters658cba62001-02-09 20:06:00 +0000872
Guido van Rossum3a41c612003-01-28 15:10:22 +0000873 def save_tuple(self, obj):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300874 if not obj: # tuple is empty
875 if self.bin:
876 self.write(EMPTY_TUPLE)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000877 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300878 self.write(MARK + TUPLE)
Tim Petersd97da802003-01-28 05:48:29 +0000879 return
880
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300881 n = len(obj)
Tim Petersd97da802003-01-28 05:48:29 +0000882 save = self.save
883 memo = self.memo
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300884 if n <= 3 and self.proto >= 2:
Guido van Rossum3a41c612003-01-28 15:10:22 +0000885 for element in obj:
Tim Petersd97da802003-01-28 05:48:29 +0000886 save(element)
887 # Subtle. Same as in the big comment below.
Guido van Rossum3a41c612003-01-28 15:10:22 +0000888 if id(obj) in memo:
889 get = self.get(memo[id(obj)][0])
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300890 self.write(POP * n + get)
Tim Petersd97da802003-01-28 05:48:29 +0000891 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300892 self.write(_tuplesize2code[n])
Guido van Rossum3a41c612003-01-28 15:10:22 +0000893 self.memoize(obj)
Tim Petersd97da802003-01-28 05:48:29 +0000894 return
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000895
Tim Peters1d63c9f2003-02-02 20:29:39 +0000896 # proto 0 or proto 1 and tuple isn't empty, or proto > 1 and tuple
Tim Petersff57bff2003-01-28 05:34:53 +0000897 # has more than 3 elements.
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300898 write = self.write
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000899 write(MARK)
Guido van Rossum3a41c612003-01-28 15:10:22 +0000900 for element in obj:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000901 save(element)
902
Tim Peters1d63c9f2003-02-02 20:29:39 +0000903 if id(obj) in memo:
Tim Petersf558da02003-01-28 02:09:55 +0000904 # Subtle. d was not in memo when we entered save_tuple(), so
905 # the process of saving the tuple's elements must have saved
906 # the tuple itself: the tuple is recursive. The proper action
907 # now is to throw away everything we put on the stack, and
908 # simply GET the tuple (it's already constructed). This check
909 # could have been done in the "for element" loop instead, but
910 # recursive tuples are a rare thing.
Guido van Rossum3a41c612003-01-28 15:10:22 +0000911 get = self.get(memo[id(obj)][0])
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300912 if self.bin:
Tim Petersf558da02003-01-28 02:09:55 +0000913 write(POP_MARK + get)
914 else: # proto 0 -- POP_MARK not available
Tim Petersd97da802003-01-28 05:48:29 +0000915 write(POP * (n+1) + get)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000916 return
917
Tim Peters1d63c9f2003-02-02 20:29:39 +0000918 # No recursion.
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300919 write(TUPLE)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000920 self.memoize(obj)
Jeremy Hylton3422c992003-01-24 19:29:52 +0000921
Guido van Rossum13257902007-06-07 23:15:56 +0000922 dispatch[tuple] = save_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000923
Guido van Rossum3a41c612003-01-28 15:10:22 +0000924 def save_list(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000925 if self.bin:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300926 self.write(EMPTY_LIST)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000927 else: # proto 0 -- can't use EMPTY_LIST
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300928 self.write(MARK + LIST)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000929
930 self.memoize(obj)
Alexandre Vassalottic7db1d62008-05-14 21:57:18 +0000931 self._batch_appends(obj)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000932
Guido van Rossum13257902007-06-07 23:15:56 +0000933 dispatch[list] = save_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000934
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000935 _BATCHSIZE = 1000
936
937 def _batch_appends(self, items):
938 # Helper to batch up APPENDS sequences
939 save = self.save
940 write = self.write
941
942 if not self.bin:
943 for x in items:
944 save(x)
945 write(APPEND)
946 return
947
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300948 it = iter(items)
949 while True:
950 tmp = list(islice(it, self._BATCHSIZE))
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000951 n = len(tmp)
952 if n > 1:
953 write(MARK)
954 for x in tmp:
955 save(x)
956 write(APPENDS)
957 elif n:
958 save(tmp[0])
959 write(APPEND)
960 # else tmp is empty, and we're done
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300961 if n < self._BATCHSIZE:
962 return
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000963
Guido van Rossum3a41c612003-01-28 15:10:22 +0000964 def save_dict(self, obj):
Tim Petersc32d8242001-04-10 02:48:53 +0000965 if self.bin:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300966 self.write(EMPTY_DICT)
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000967 else: # proto 0 -- can't use EMPTY_DICT
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300968 self.write(MARK + DICT)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000969
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000970 self.memoize(obj)
Alexandre Vassalottic7db1d62008-05-14 21:57:18 +0000971 self._batch_setitems(obj.items())
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000972
Guido van Rossum13257902007-06-07 23:15:56 +0000973 dispatch[dict] = save_dict
974 if PyStringMap is not None:
Jeremy Hylton2b9d0291998-05-27 22:38:22 +0000975 dispatch[PyStringMap] = save_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +0000976
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000977 def _batch_setitems(self, items):
978 # Helper to batch up SETITEMS sequences; proto >= 1 only
979 save = self.save
980 write = self.write
981
982 if not self.bin:
983 for k, v in items:
984 save(k)
985 save(v)
986 write(SETITEM)
987 return
988
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +0300989 it = iter(items)
990 while True:
991 tmp = list(islice(it, self._BATCHSIZE))
Guido van Rossum25cb7df2003-01-31 18:53:21 +0000992 n = len(tmp)
993 if n > 1:
994 write(MARK)
995 for k, v in tmp:
996 save(k)
997 save(v)
998 write(SETITEMS)
999 elif n:
1000 k, v = tmp[0]
1001 save(k)
1002 save(v)
1003 write(SETITEM)
1004 # else tmp is empty, and we're done
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001005 if n < self._BATCHSIZE:
1006 return
Guido van Rossum25cb7df2003-01-31 18:53:21 +00001007
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001008 def save_set(self, obj):
1009 save = self.save
1010 write = self.write
1011
1012 if self.proto < 4:
1013 self.save_reduce(set, (list(obj),), obj=obj)
1014 return
1015
1016 write(EMPTY_SET)
1017 self.memoize(obj)
1018
1019 it = iter(obj)
1020 while True:
1021 batch = list(islice(it, self._BATCHSIZE))
1022 n = len(batch)
1023 if n > 0:
1024 write(MARK)
1025 for item in batch:
1026 save(item)
1027 write(ADDITEMS)
1028 if n < self._BATCHSIZE:
1029 return
1030 dispatch[set] = save_set
1031
1032 def save_frozenset(self, obj):
1033 save = self.save
1034 write = self.write
1035
1036 if self.proto < 4:
1037 self.save_reduce(frozenset, (list(obj),), obj=obj)
1038 return
1039
1040 write(MARK)
1041 for item in obj:
1042 save(item)
1043
1044 if id(obj) in self.memo:
1045 # If the object is already in the memo, this means it is
1046 # recursive. In this case, throw away everything we put on the
1047 # stack, and fetch the object back from the memo.
1048 write(POP_MARK + self.get(self.memo[id(obj)][0]))
1049 return
1050
1051 write(FROZENSET)
1052 self.memoize(obj)
1053 dispatch[frozenset] = save_frozenset
1054
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001055 def save_global(self, obj, name=None):
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001056 write = self.write
1057 memo = self.memo
1058
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001059 if name is None:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001060 name = getattr(obj, '__qualname__', None)
Tim Petersc32d8242001-04-10 02:48:53 +00001061 if name is None:
Guido van Rossum3a41c612003-01-28 15:10:22 +00001062 name = obj.__name__
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001063
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001064 module_name = whichmodule(obj, name)
Guido van Rossumb0a98e92001-08-17 18:49:52 +00001065 try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001066 __import__(module_name, level=0)
1067 module = sys.modules[module_name]
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001068 obj2, parent = _getattribute(module, name)
Guido van Rossumb0a98e92001-08-17 18:49:52 +00001069 except (ImportError, KeyError, AttributeError):
1070 raise PicklingError(
1071 "Can't pickle %r: it's not found as %s.%s" %
Serhiy Storchaka5affd232017-04-05 09:37:24 +03001072 (obj, module_name, name)) from None
Guido van Rossumb0a98e92001-08-17 18:49:52 +00001073 else:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001074 if obj2 is not obj:
Guido van Rossumb0a98e92001-08-17 18:49:52 +00001075 raise PicklingError(
1076 "Can't pickle %r: it's not the same object as %s.%s" %
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001077 (obj, module_name, name))
Guido van Rossumb0a98e92001-08-17 18:49:52 +00001078
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001079 if self.proto >= 2:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001080 code = _extension_registry.get((module_name, name))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001081 if code:
1082 assert code > 0
1083 if code <= 0xff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001084 write(EXT1 + pack("<B", code))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001085 elif code <= 0xffff:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001086 write(EXT2 + pack("<H", code))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001087 else:
1088 write(EXT4 + pack("<i", code))
1089 return
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001090 lastname = name.rpartition('.')[2]
1091 if parent is module:
1092 name = lastname
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001093 # Non-ASCII identifiers are supported only with protocols >= 3.
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001094 if self.proto >= 4:
1095 self.save(module_name)
1096 self.save(name)
1097 write(STACK_GLOBAL)
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001098 elif parent is not module:
1099 self.save_reduce(getattr, (parent, lastname))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001100 elif self.proto >= 3:
1101 write(GLOBAL + bytes(module_name, "utf-8") + b'\n' +
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001102 bytes(name, "utf-8") + b'\n')
1103 else:
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001104 if self.fix_imports:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001105 r_name_mapping = _compat_pickle.REVERSE_NAME_MAPPING
1106 r_import_mapping = _compat_pickle.REVERSE_IMPORT_MAPPING
1107 if (module_name, name) in r_name_mapping:
1108 module_name, name = r_name_mapping[(module_name, name)]
Serhiy Storchakabfe18242015-03-31 13:12:37 +03001109 elif module_name in r_import_mapping:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001110 module_name = r_import_mapping[module_name]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001111 try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001112 write(GLOBAL + bytes(module_name, "ascii") + b'\n' +
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001113 bytes(name, "ascii") + b'\n')
1114 except UnicodeEncodeError:
1115 raise PicklingError(
1116 "can't pickle global identifier '%s.%s' using "
Serhiy Storchaka5affd232017-04-05 09:37:24 +03001117 "pickle protocol %i" % (module, name, self.proto)) from None
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001118
Guido van Rossum3a41c612003-01-28 15:10:22 +00001119 self.memoize(obj)
Tim Peters3b769832003-01-28 03:51:36 +00001120
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08001121 def save_type(self, obj):
1122 if obj is type(None):
1123 return self.save_reduce(type, (None,), obj=obj)
1124 elif obj is type(NotImplemented):
1125 return self.save_reduce(type, (NotImplemented,), obj=obj)
1126 elif obj is type(...):
1127 return self.save_reduce(type, (...,), obj=obj)
1128 return self.save_global(obj)
1129
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001130 dispatch[FunctionType] = save_global
Alexandre Vassalotti19b6fa62013-11-30 16:06:39 -08001131 dispatch[type] = save_type
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001132
Guido van Rossuma48061a1995-01-10 00:31:14 +00001133
Guido van Rossum1be31752003-01-28 15:19:53 +00001134# Unpickling machinery
1135
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001136class _Unpickler:
Guido van Rossuma48061a1995-01-10 00:31:14 +00001137
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001138 def __init__(self, file, *, fix_imports=True,
Antoine Pitrou91f43802019-05-26 17:10:09 +02001139 encoding="ASCII", errors="strict", buffers=None):
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001140 """This takes a binary file for reading a pickle data stream.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001141
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001142 The protocol version of the pickle is detected automatically, so
1143 no proto argument is needed.
1144
1145 The argument *file* must have two methods, a read() method that
1146 takes an integer argument, and a readline() method that requires
1147 no arguments. Both methods should return bytes. Thus *file*
Martin Panter7462b6492015-11-02 03:37:02 +00001148 can be a binary file object opened for reading, an io.BytesIO
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001149 object, or any other custom object that meets this interface.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001150
Guido van Rossumfeea0782007-10-10 18:00:50 +00001151 The file-like object must have two methods, a read() method
1152 that takes an integer argument, and a readline() method that
1153 requires no arguments. Both methods should return bytes.
1154 Thus file-like object can be a binary file object opened for
1155 reading, a BytesIO object, or any other custom object that
1156 meets this interface.
Guido van Rossumf4169812008-03-17 22:56:06 +00001157
Antoine Pitrou91f43802019-05-26 17:10:09 +02001158 If *buffers* is not None, it should be an iterable of buffer-enabled
1159 objects that is consumed each time the pickle stream references
1160 an out-of-band buffer view. Such buffers have been given in order
1161 to the *buffer_callback* of a Pickler object.
1162
1163 If *buffers* is None (the default), then the buffers are taken
1164 from the pickle stream, assuming they are serialized there.
1165 It is an error for *buffers* to be None if the pickle stream
1166 was produced with a non-None *buffer_callback*.
1167
1168 Other optional arguments are *fix_imports*, *encoding* and
Martin Panter46f50722016-05-26 05:35:26 +00001169 *errors*, which are used to control compatibility support for
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001170 pickle stream generated by Python 2. If *fix_imports* is True,
1171 pickle will try to map the old Python 2 names to the new names
1172 used in Python 3. The *encoding* and *errors* tell pickle how
1173 to decode 8-bit string instances pickled by Python 2; these
1174 default to 'ASCII' and 'strict', respectively. *encoding* can be
1175 'bytes' to read theses 8-bit string instances as bytes objects.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001176 """
Antoine Pitrou91f43802019-05-26 17:10:09 +02001177 self._buffers = iter(buffers) if buffers is not None else None
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001178 self._file_readline = file.readline
1179 self._file_read = file.read
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001180 self.memo = {}
Guido van Rossumf4169812008-03-17 22:56:06 +00001181 self.encoding = encoding
1182 self.errors = errors
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001183 self.proto = 0
1184 self.fix_imports = fix_imports
Guido van Rossuma48061a1995-01-10 00:31:14 +00001185
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001186 def load(self):
Guido van Rossum3a41c612003-01-28 15:10:22 +00001187 """Read a pickled object representation from the open file.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001188
Guido van Rossum3a41c612003-01-28 15:10:22 +00001189 Return the reconstituted object hierarchy specified in the file.
Raymond Hettingeraef22fb2002-05-29 16:18:42 +00001190 """
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +00001191 # Check whether Unpickler was initialized correctly. This is
1192 # only needed to mimic the behavior of _pickle.Unpickler.dump().
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001193 if not hasattr(self, "_file_read"):
Alexandre Vassalotti3cfcab92008-12-27 09:30:39 +00001194 raise UnpicklingError("Unpickler.__init__() was not called by "
1195 "%s.__init__()" % (self.__class__.__name__,))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001196 self._unframer = _Unframer(self._file_read, self._file_readline)
1197 self.read = self._unframer.read
Antoine Pitrou91f43802019-05-26 17:10:09 +02001198 self.readinto = self._unframer.readinto
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001199 self.readline = self._unframer.readline
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001200 self.metastack = []
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001201 self.stack = []
1202 self.append = self.stack.append
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001203 self.proto = 0
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001204 read = self.read
1205 dispatch = self.dispatch
1206 try:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001207 while True:
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001208 key = read(1)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001209 if not key:
1210 raise EOFError
Guido van Rossum98297ee2007-11-06 21:34:58 +00001211 assert isinstance(key, bytes_types)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001212 dispatch[key[0]](self)
Guido van Rossumb940e112007-01-10 16:19:56 +00001213 except _Stop as stopinst:
Guido van Rossumff871742000-12-13 18:11:56 +00001214 return stopinst.value
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001215
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001216 # Return a list of items pushed in the stack after last MARK instruction.
1217 def pop_mark(self):
1218 items = self.stack
1219 self.stack = self.metastack.pop()
1220 self.append = self.stack.append
1221 return items
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001222
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001223 def persistent_load(self, pid):
Benjamin Peterson49956b22009-01-10 17:05:44 +00001224 raise UnpicklingError("unsupported persistent id encountered")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001225
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001226 dispatch = {}
1227
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001228 def load_proto(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001229 proto = self.read(1)[0]
Guido van Rossumf4169812008-03-17 22:56:06 +00001230 if not 0 <= proto <= HIGHEST_PROTOCOL:
Guido van Rossum26d95c32007-08-27 23:18:54 +00001231 raise ValueError("unsupported pickle protocol: %d" % proto)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001232 self.proto = proto
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001233 dispatch[PROTO[0]] = load_proto
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001234
Alexandre Vassalottib6a2f2a2013-11-23 20:30:03 -08001235 def load_frame(self):
1236 frame_size, = unpack('<Q', self.read(8))
1237 if frame_size > sys.maxsize:
1238 raise ValueError("frame size > sys.maxsize: %d" % frame_size)
1239 self._unframer.load_frame(frame_size)
1240 dispatch[FRAME[0]] = load_frame
1241
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001242 def load_persid(self):
Serhiy Storchakadec25af2016-07-17 11:24:17 +03001243 try:
1244 pid = self.readline()[:-1].decode("ascii")
1245 except UnicodeDecodeError:
1246 raise UnpicklingError(
1247 "persistent IDs in protocol 0 must be ASCII strings")
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001248 self.append(self.persistent_load(pid))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001249 dispatch[PERSID[0]] = load_persid
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001250
1251 def load_binpersid(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001252 pid = self.stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001253 self.append(self.persistent_load(pid))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001254 dispatch[BINPERSID[0]] = load_binpersid
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001255
1256 def load_none(self):
1257 self.append(None)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001258 dispatch[NONE[0]] = load_none
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001259
Guido van Rossum7d97d312003-01-28 04:25:27 +00001260 def load_false(self):
1261 self.append(False)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001262 dispatch[NEWFALSE[0]] = load_false
Guido van Rossum7d97d312003-01-28 04:25:27 +00001263
1264 def load_true(self):
1265 self.append(True)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001266 dispatch[NEWTRUE[0]] = load_true
Guido van Rossum7d97d312003-01-28 04:25:27 +00001267
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001268 def load_int(self):
Tim Peters19ef62d2001-08-28 22:21:18 +00001269 data = self.readline()
Guido van Rossume2763392002-04-05 19:30:08 +00001270 if data == FALSE[1:]:
1271 val = False
1272 elif data == TRUE[1:]:
1273 val = True
1274 else:
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001275 val = int(data, 0)
Guido van Rossume2763392002-04-05 19:30:08 +00001276 self.append(val)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001277 dispatch[INT[0]] = load_int
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001278
1279 def load_binint(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001280 self.append(unpack('<i', self.read(4))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001281 dispatch[BININT[0]] = load_binint
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001282
1283 def load_binint1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001284 self.append(self.read(1)[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001285 dispatch[BININT1[0]] = load_binint1
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001286
1287 def load_binint2(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001288 self.append(unpack('<H', self.read(2))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001289 dispatch[BININT2[0]] = load_binint2
Tim Peters2344fae2001-01-15 00:50:52 +00001290
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001291 def load_long(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001292 val = self.readline()[:-1]
1293 if val and val[-1] == b'L'[0]:
Mark Dickinson8dd05142009-01-20 20:43:58 +00001294 val = val[:-1]
Guido van Rossumfeea0782007-10-10 18:00:50 +00001295 self.append(int(val, 0))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001296 dispatch[LONG[0]] = load_long
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001297
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001298 def load_long1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001299 n = self.read(1)[0]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001300 data = self.read(n)
1301 self.append(decode_long(data))
1302 dispatch[LONG1[0]] = load_long1
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001303
1304 def load_long4(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001305 n, = unpack('<i', self.read(4))
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001306 if n < 0:
1307 # Corrupt or hostile pickle -- we never write one like this
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001308 raise UnpicklingError("LONG pickle has negative byte count")
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001309 data = self.read(n)
1310 self.append(decode_long(data))
1311 dispatch[LONG4[0]] = load_long4
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001312
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001313 def load_float(self):
Guido van Rossumff871742000-12-13 18:11:56 +00001314 self.append(float(self.readline()[:-1]))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001315 dispatch[FLOAT[0]] = load_float
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001316
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001317 def load_binfloat(self):
Guido van Rossumd3703791998-10-22 20:15:36 +00001318 self.append(unpack('>d', self.read(8))[0])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001319 dispatch[BINFLOAT[0]] = load_binfloat
Guido van Rossumd3703791998-10-22 20:15:36 +00001320
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001321 def _decode_string(self, value):
1322 # Used to allow strings from Python 2 to be decoded either as
1323 # bytes or Unicode strings. This should be used only with the
1324 # STRING, BINSTRING and SHORT_BINSTRING opcodes.
1325 if self.encoding == "bytes":
1326 return value
1327 else:
1328 return value.decode(self.encoding, self.errors)
1329
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001330 def load_string(self):
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001331 data = self.readline()[:-1]
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001332 # Strip outermost quotes
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001333 if len(data) >= 2 and data[0] == data[-1] and data[0] in b'"\'':
1334 data = data[1:-1]
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001335 else:
Alexandre Vassalotti7c5e0942013-04-15 23:14:55 -07001336 raise UnpicklingError("the STRING opcode argument must be quoted")
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001337 self.append(self._decode_string(codecs.escape_decode(data)[0]))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001338 dispatch[STRING[0]] = load_string
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001339
1340 def load_binstring(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001341 # Deprecated BINSTRING uses signed 32-bit length
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001342 len, = unpack('<i', self.read(4))
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001343 if len < 0:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001344 raise UnpicklingError("BINSTRING pickle has negative byte count")
Guido van Rossumf4169812008-03-17 22:56:06 +00001345 data = self.read(len)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001346 self.append(self._decode_string(data))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001347 dispatch[BINSTRING[0]] = load_binstring
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001348
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001349 def load_binbytes(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001350 len, = unpack('<I', self.read(4))
1351 if len > maxsize:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001352 raise UnpicklingError("BINBYTES exceeds system's maximum size "
1353 "of %d bytes" % maxsize)
Guido van Rossumf4169812008-03-17 22:56:06 +00001354 self.append(self.read(len))
1355 dispatch[BINBYTES[0]] = load_binbytes
1356
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001357 def load_unicode(self):
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001358 self.append(str(self.readline()[:-1], 'raw-unicode-escape'))
1359 dispatch[UNICODE[0]] = load_unicode
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001360
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001361 def load_binunicode(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001362 len, = unpack('<I', self.read(4))
1363 if len > maxsize:
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001364 raise UnpicklingError("BINUNICODE exceeds system's maximum size "
1365 "of %d bytes" % maxsize)
Victor Stinner485fb562010-04-13 11:07:24 +00001366 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001367 dispatch[BINUNICODE[0]] = load_binunicode
Guido van Rossumb5f2f1b2000-03-10 23:20:09 +00001368
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001369 def load_binunicode8(self):
1370 len, = unpack('<Q', self.read(8))
1371 if len > maxsize:
1372 raise UnpicklingError("BINUNICODE8 exceeds system's maximum size "
1373 "of %d bytes" % maxsize)
1374 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
1375 dispatch[BINUNICODE8[0]] = load_binunicode8
1376
Serhiy Storchakae0606192015-09-29 22:10:07 +03001377 def load_binbytes8(self):
1378 len, = unpack('<Q', self.read(8))
1379 if len > maxsize:
1380 raise UnpicklingError("BINBYTES8 exceeds system's maximum size "
1381 "of %d bytes" % maxsize)
1382 self.append(self.read(len))
1383 dispatch[BINBYTES8[0]] = load_binbytes8
1384
Antoine Pitrou91f43802019-05-26 17:10:09 +02001385 def load_bytearray8(self):
1386 len, = unpack('<Q', self.read(8))
1387 if len > maxsize:
1388 raise UnpicklingError("BYTEARRAY8 exceeds system's maximum size "
1389 "of %d bytes" % maxsize)
1390 b = bytearray(len)
1391 self.readinto(b)
1392 self.append(b)
1393 dispatch[BYTEARRAY8[0]] = load_bytearray8
1394
1395 def load_next_buffer(self):
1396 if self._buffers is None:
1397 raise UnpicklingError("pickle stream refers to out-of-band data "
1398 "but no *buffers* argument was given")
1399 try:
1400 buf = next(self._buffers)
1401 except StopIteration:
1402 raise UnpicklingError("not enough out-of-band buffers")
1403 self.append(buf)
1404 dispatch[NEXT_BUFFER[0]] = load_next_buffer
1405
1406 def load_readonly_buffer(self):
1407 buf = self.stack[-1]
1408 with memoryview(buf) as m:
1409 if not m.readonly:
1410 self.stack[-1] = m.toreadonly()
1411 dispatch[READONLY_BUFFER[0]] = load_readonly_buffer
1412
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001413 def load_short_binstring(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001414 len = self.read(1)[0]
1415 data = self.read(len)
Alexandre Vassalottid05c9ff2013-12-07 01:09:27 -08001416 self.append(self._decode_string(data))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001417 dispatch[SHORT_BINSTRING[0]] = load_short_binstring
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001418
Guido van Rossumf4169812008-03-17 22:56:06 +00001419 def load_short_binbytes(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001420 len = self.read(1)[0]
1421 self.append(self.read(len))
Guido van Rossumf4169812008-03-17 22:56:06 +00001422 dispatch[SHORT_BINBYTES[0]] = load_short_binbytes
1423
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001424 def load_short_binunicode(self):
1425 len = self.read(1)[0]
1426 self.append(str(self.read(len), 'utf-8', 'surrogatepass'))
1427 dispatch[SHORT_BINUNICODE[0]] = load_short_binunicode
1428
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001429 def load_tuple(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001430 items = self.pop_mark()
1431 self.append(tuple(items))
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001432 dispatch[TUPLE[0]] = load_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001433
1434 def load_empty_tuple(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001435 self.append(())
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001436 dispatch[EMPTY_TUPLE[0]] = load_empty_tuple
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001437
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001438 def load_tuple1(self):
1439 self.stack[-1] = (self.stack[-1],)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001440 dispatch[TUPLE1[0]] = load_tuple1
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001441
1442 def load_tuple2(self):
1443 self.stack[-2:] = [(self.stack[-2], self.stack[-1])]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001444 dispatch[TUPLE2[0]] = load_tuple2
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001445
1446 def load_tuple3(self):
1447 self.stack[-3:] = [(self.stack[-3], self.stack[-2], self.stack[-1])]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001448 dispatch[TUPLE3[0]] = load_tuple3
Guido van Rossum44f0ea52003-01-28 04:14:51 +00001449
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001450 def load_empty_list(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001451 self.append([])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001452 dispatch[EMPTY_LIST[0]] = load_empty_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001453
1454 def load_empty_dictionary(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001455 self.append({})
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001456 dispatch[EMPTY_DICT[0]] = load_empty_dictionary
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001457
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001458 def load_empty_set(self):
1459 self.append(set())
1460 dispatch[EMPTY_SET[0]] = load_empty_set
1461
1462 def load_frozenset(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001463 items = self.pop_mark()
1464 self.append(frozenset(items))
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001465 dispatch[FROZENSET[0]] = load_frozenset
1466
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001467 def load_list(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001468 items = self.pop_mark()
1469 self.append(items)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001470 dispatch[LIST[0]] = load_list
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001471
1472 def load_dict(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001473 items = self.pop_mark()
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001474 d = {items[i]: items[i+1]
1475 for i in range(0, len(items), 2)}
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001476 self.append(d)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001477 dispatch[DICT[0]] = load_dict
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001478
Tim Petersd01c1e92003-01-30 15:41:46 +00001479 # INST and OBJ differ only in how they get a class object. It's not
1480 # only sensible to do the rest in a common routine, the two routines
1481 # previously diverged and grew different bugs.
1482 # klass is the class to instantiate, and k points to the topmost mark
1483 # object, following which are the arguments for klass.__init__.
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001484 def _instantiate(self, klass, args):
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00001485 if (args or not isinstance(klass, type) or
1486 hasattr(klass, "__getinitargs__")):
Guido van Rossum743d17e1998-09-15 20:25:57 +00001487 try:
Guido van Rossumb26a97a2003-01-28 22:29:13 +00001488 value = klass(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +00001489 except TypeError as err:
Guido van Rossum26d95c32007-08-27 23:18:54 +00001490 raise TypeError("in constructor for %s: %s" %
1491 (klass.__name__, str(err)), sys.exc_info()[2])
Alexander Belopolskyd92f0402010-07-17 22:50:45 +00001492 else:
1493 value = klass.__new__(klass)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001494 self.append(value)
Tim Petersd01c1e92003-01-30 15:41:46 +00001495
1496 def load_inst(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001497 module = self.readline()[:-1].decode("ascii")
1498 name = self.readline()[:-1].decode("ascii")
Tim Petersd01c1e92003-01-30 15:41:46 +00001499 klass = self.find_class(module, name)
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001500 self._instantiate(klass, self.pop_mark())
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001501 dispatch[INST[0]] = load_inst
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001502
1503 def load_obj(self):
Tim Petersd01c1e92003-01-30 15:41:46 +00001504 # Stack is ... markobject classobject arg1 arg2 ...
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001505 args = self.pop_mark()
1506 cls = args.pop(0)
1507 self._instantiate(cls, args)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001508 dispatch[OBJ[0]] = load_obj
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001509
Guido van Rossum3a41c612003-01-28 15:10:22 +00001510 def load_newobj(self):
1511 args = self.stack.pop()
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001512 cls = self.stack.pop()
Guido van Rossum3a41c612003-01-28 15:10:22 +00001513 obj = cls.__new__(cls, *args)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001514 self.append(obj)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001515 dispatch[NEWOBJ[0]] = load_newobj
Guido van Rossum3a41c612003-01-28 15:10:22 +00001516
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001517 def load_newobj_ex(self):
1518 kwargs = self.stack.pop()
1519 args = self.stack.pop()
1520 cls = self.stack.pop()
1521 obj = cls.__new__(cls, *args, **kwargs)
1522 self.append(obj)
1523 dispatch[NEWOBJ_EX[0]] = load_newobj_ex
1524
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001525 def load_global(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001526 module = self.readline()[:-1].decode("utf-8")
1527 name = self.readline()[:-1].decode("utf-8")
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001528 klass = self.find_class(module, name)
1529 self.append(klass)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001530 dispatch[GLOBAL[0]] = load_global
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001531
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001532 def load_stack_global(self):
1533 name = self.stack.pop()
1534 module = self.stack.pop()
1535 if type(name) is not str or type(module) is not str:
1536 raise UnpicklingError("STACK_GLOBAL requires str")
1537 self.append(self.find_class(module, name))
1538 dispatch[STACK_GLOBAL[0]] = load_stack_global
1539
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001540 def load_ext1(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001541 code = self.read(1)[0]
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001542 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001543 dispatch[EXT1[0]] = load_ext1
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001544
1545 def load_ext2(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001546 code, = unpack('<H', self.read(2))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001547 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001548 dispatch[EXT2[0]] = load_ext2
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001549
1550 def load_ext4(self):
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001551 code, = unpack('<i', self.read(4))
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001552 self.get_extension(code)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001553 dispatch[EXT4[0]] = load_ext4
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001554
1555 def get_extension(self, code):
1556 nil = []
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001557 obj = _extension_cache.get(code, nil)
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001558 if obj is not nil:
1559 self.append(obj)
1560 return
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001561 key = _inverted_registry.get(code)
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001562 if not key:
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001563 if code <= 0: # note that 0 is forbidden
1564 # Corrupt or hostile pickle.
Alexandre Vassalotticc757172013-04-14 02:25:10 -07001565 raise UnpicklingError("EXT specifies code <= 0")
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001566 raise ValueError("unregistered extension code %d" % code)
1567 obj = self.find_class(*key)
Guido van Rossumd4b920c2003-02-04 01:54:49 +00001568 _extension_cache[code] = obj
Guido van Rossum255f3ee2003-01-29 06:14:11 +00001569 self.append(obj)
1570
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001571 def find_class(self, module, name):
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001572 # Subclasses may override this.
Steve Dowerb82e17e2019-05-23 08:45:22 -07001573 sys.audit('pickle.find_class', module, name)
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001574 if self.proto < 3 and self.fix_imports:
1575 if (module, name) in _compat_pickle.NAME_MAPPING:
1576 module, name = _compat_pickle.NAME_MAPPING[(module, name)]
Serhiy Storchakabfe18242015-03-31 13:12:37 +03001577 elif module in _compat_pickle.IMPORT_MAPPING:
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001578 module = _compat_pickle.IMPORT_MAPPING[module]
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001579 __import__(module, level=0)
Serhiy Storchaka58e41342015-03-31 14:07:24 +03001580 if self.proto >= 4:
1581 return _getattribute(sys.modules[module], name)[0]
1582 else:
1583 return getattr(sys.modules[module], name)
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001584
1585 def load_reduce(self):
1586 stack = self.stack
Guido van Rossumb26a97a2003-01-28 22:29:13 +00001587 args = stack.pop()
1588 func = stack[-1]
Serhiy Storchakaa8d83f52015-12-01 00:39:25 +02001589 stack[-1] = func(*args)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001590 dispatch[REDUCE[0]] = load_reduce
Guido van Rossuma48061a1995-01-10 00:31:14 +00001591
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001592 def load_pop(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001593 if self.stack:
1594 del self.stack[-1]
1595 else:
1596 self.pop_mark()
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001597 dispatch[POP[0]] = load_pop
Guido van Rossum7b5430f1995-03-04 22:25:21 +00001598
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001599 def load_pop_mark(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001600 self.pop_mark()
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001601 dispatch[POP_MARK[0]] = load_pop_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +00001602
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001603 def load_dup(self):
Guido van Rossumb1062fc1998-03-31 17:00:46 +00001604 self.append(self.stack[-1])
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001605 dispatch[DUP[0]] = load_dup
Guido van Rossuma48061a1995-01-10 00:31:14 +00001606
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001607 def load_get(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001608 i = int(self.readline()[:-1])
Claudiu Popa6f03b232019-11-24 20:15:08 +01001609 try:
1610 self.append(self.memo[i])
1611 except KeyError:
1612 msg = f'Memo value not found at index {i}'
1613 raise UnpicklingError(msg) from None
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001614 dispatch[GET[0]] = load_get
Guido van Rossum78536471996-04-12 13:36:27 +00001615
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001616 def load_binget(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001617 i = self.read(1)[0]
Claudiu Popa6f03b232019-11-24 20:15:08 +01001618 try:
1619 self.append(self.memo[i])
1620 except KeyError as exc:
1621 msg = f'Memo value not found at index {i}'
1622 raise UnpicklingError(msg) from None
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001623 dispatch[BINGET[0]] = load_binget
Guido van Rossum78536471996-04-12 13:36:27 +00001624
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001625 def load_long_binget(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001626 i, = unpack('<I', self.read(4))
Claudiu Popa6f03b232019-11-24 20:15:08 +01001627 try:
1628 self.append(self.memo[i])
1629 except KeyError as exc:
1630 msg = f'Memo value not found at index {i}'
1631 raise UnpicklingError(msg) from None
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001632 dispatch[LONG_BINGET[0]] = load_long_binget
Guido van Rossum78536471996-04-12 13:36:27 +00001633
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001634 def load_put(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001635 i = int(self.readline()[:-1])
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001636 if i < 0:
1637 raise ValueError("negative PUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001638 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001639 dispatch[PUT[0]] = load_put
Guido van Rossuma48061a1995-01-10 00:31:14 +00001640
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001641 def load_binput(self):
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001642 i = self.read(1)[0]
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001643 if i < 0:
1644 raise ValueError("negative BINPUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001645 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001646 dispatch[BINPUT[0]] = load_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +00001647
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001648 def load_long_binput(self):
Antoine Pitroubf6ecf92012-11-24 20:40:21 +01001649 i, = unpack('<I', self.read(4))
1650 if i > maxsize:
Antoine Pitrou55549ec2011-08-30 00:27:10 +02001651 raise ValueError("negative LONG_BINPUT argument")
Alexandre Vassalottica2d6102008-06-12 18:26:05 +00001652 self.memo[i] = self.stack[-1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001653 dispatch[LONG_BINPUT[0]] = load_long_binput
Guido van Rossuma48061a1995-01-10 00:31:14 +00001654
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001655 def load_memoize(self):
1656 memo = self.memo
1657 memo[len(memo)] = self.stack[-1]
1658 dispatch[MEMOIZE[0]] = load_memoize
1659
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001660 def load_append(self):
1661 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001662 value = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001663 list = stack[-1]
1664 list.append(value)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001665 dispatch[APPEND[0]] = load_append
Guido van Rossuma48061a1995-01-10 00:31:14 +00001666
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001667 def load_appends(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001668 items = self.pop_mark()
1669 list_obj = self.stack[-1]
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02001670 try:
1671 extend = list_obj.extend
1672 except AttributeError:
1673 pass
Alexandre Vassalotti1f7492c2013-04-20 13:19:46 -07001674 else:
Serhiy Storchakabee09ae2017-02-02 11:12:47 +02001675 extend(items)
1676 return
1677 # Even if the PEP 307 requires extend() and append() methods,
1678 # fall back on append() if the object has no extend() method
1679 # for backward compatibility.
1680 append = list_obj.append
1681 for item in items:
1682 append(item)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001683 dispatch[APPENDS[0]] = load_appends
Tim Peters2344fae2001-01-15 00:50:52 +00001684
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001685 def load_setitem(self):
1686 stack = self.stack
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001687 value = stack.pop()
1688 key = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001689 dict = stack[-1]
1690 dict[key] = value
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001691 dispatch[SETITEM[0]] = load_setitem
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001692
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001693 def load_setitems(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001694 items = self.pop_mark()
1695 dict = self.stack[-1]
1696 for i in range(0, len(items), 2):
1697 dict[items[i]] = items[i + 1]
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001698 dispatch[SETITEMS[0]] = load_setitems
Guido van Rossuma48061a1995-01-10 00:31:14 +00001699
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001700 def load_additems(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001701 items = self.pop_mark()
1702 set_obj = self.stack[-1]
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001703 if isinstance(set_obj, set):
1704 set_obj.update(items)
1705 else:
1706 add = set_obj.add
1707 for item in items:
1708 add(item)
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001709 dispatch[ADDITEMS[0]] = load_additems
1710
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001711 def load_build(self):
1712 stack = self.stack
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001713 state = stack.pop()
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001714 inst = stack[-1]
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001715 setstate = getattr(inst, "__setstate__", None)
Serhiy Storchakaa3e32c92013-04-14 13:37:02 +03001716 if setstate is not None:
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001717 setstate(state)
1718 return
1719 slotstate = None
1720 if isinstance(state, tuple) and len(state) == 2:
1721 state, slotstate = state
1722 if state:
Alexandre Vassalottiebfecfd2009-05-25 18:50:33 +00001723 inst_dict = inst.__dict__
Antoine Pitroua9f48a02009-05-02 21:41:14 +00001724 intern = sys.intern
Alexandre Vassalottiebfecfd2009-05-25 18:50:33 +00001725 for k, v in state.items():
1726 if type(k) is str:
1727 inst_dict[intern(k)] = v
1728 else:
1729 inst_dict[k] = v
Guido van Rossumac5b5d22003-01-28 22:01:16 +00001730 if slotstate:
1731 for k, v in slotstate.items():
1732 setattr(inst, k, v)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001733 dispatch[BUILD[0]] = load_build
Guido van Rossuma48061a1995-01-10 00:31:14 +00001734
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001735 def load_mark(self):
Serhiy Storchaka59fb6342015-12-06 22:01:35 +02001736 self.metastack.append(self.stack)
1737 self.stack = []
1738 self.append = self.stack.append
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001739 dispatch[MARK[0]] = load_mark
Guido van Rossuma48061a1995-01-10 00:31:14 +00001740
Guido van Rossumb72cf2d1997-04-09 17:32:51 +00001741 def load_stop(self):
Raymond Hettinger46ac8eb2002-06-30 03:39:14 +00001742 value = self.stack.pop()
Guido van Rossumff871742000-12-13 18:11:56 +00001743 raise _Stop(value)
Guido van Rossum2e6a4b32007-05-04 19:56:22 +00001744 dispatch[STOP[0]] = load_stop
Guido van Rossuma48061a1995-01-10 00:31:14 +00001745
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001746
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001747# Shorthands
1748
Antoine Pitrou91f43802019-05-26 17:10:09 +02001749def _dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None):
1750 _Pickler(file, protocol, fix_imports=fix_imports,
1751 buffer_callback=buffer_callback).dump(obj)
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001752
Antoine Pitrou91f43802019-05-26 17:10:09 +02001753def _dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None):
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001754 f = io.BytesIO()
Antoine Pitrou91f43802019-05-26 17:10:09 +02001755 _Pickler(f, protocol, fix_imports=fix_imports,
1756 buffer_callback=buffer_callback).dump(obj)
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001757 res = f.getvalue()
Guido van Rossum98297ee2007-11-06 21:34:58 +00001758 assert isinstance(res, bytes_types)
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001759 return res
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001760
Antoine Pitrou91f43802019-05-26 17:10:09 +02001761def _load(file, *, fix_imports=True, encoding="ASCII", errors="strict",
1762 buffers=None):
1763 return _Unpickler(file, fix_imports=fix_imports, buffers=buffers,
Antoine Pitroud9dfaa92009-06-04 20:32:06 +00001764 encoding=encoding, errors=errors).load()
Guido van Rossum0c891ce1995-03-14 15:09:05 +00001765
Serhiy Storchaka531d1e52020-05-02 09:38:01 +03001766def _loads(s, /, *, fix_imports=True, encoding="ASCII", errors="strict",
Antoine Pitrou91f43802019-05-26 17:10:09 +02001767 buffers=None):
Guido van Rossumcfe5f202007-05-08 21:26:54 +00001768 if isinstance(s, str):
1769 raise TypeError("Can't load pickle from unicode string")
1770 file = io.BytesIO(s)
Antoine Pitrou91f43802019-05-26 17:10:09 +02001771 return _Unpickler(file, fix_imports=fix_imports, buffers=buffers,
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001772 encoding=encoding, errors=errors).load()
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001773
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001774# Use the faster _pickle if possible
1775try:
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001776 from _pickle import (
1777 PickleError,
1778 PicklingError,
1779 UnpicklingError,
1780 Pickler,
1781 Unpickler,
1782 dump,
1783 dumps,
1784 load,
1785 loads
1786 )
Brett Cannoncd171c82013-07-04 17:43:24 -04001787except ImportError:
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001788 Pickler, Unpickler = _Pickler, _Unpickler
Antoine Pitrouc9dc4a22013-11-23 18:59:12 +01001789 dump, dumps, load, loads = _dump, _dumps, _load, _loads
Antoine Pitrouea99c5c2010-09-09 18:33:21 +00001790
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001791# Doctest
Guido van Rossumd6c9e632003-01-28 03:49:52 +00001792def _test():
1793 import doctest
1794 return doctest.testmod()
1795
1796if __name__ == "__main__":
Florent Xicluna54540ec2011-11-04 08:29:17 +01001797 import argparse
Alexander Belopolsky455f7bd2010-07-27 23:02:38 +00001798 parser = argparse.ArgumentParser(
1799 description='display contents of the pickle files')
1800 parser.add_argument(
1801 'pickle_file', type=argparse.FileType('br'),
1802 nargs='*', help='the pickle file')
1803 parser.add_argument(
1804 '-t', '--test', action='store_true',
1805 help='run self-test suite')
1806 parser.add_argument(
1807 '-v', action='store_true',
1808 help='run verbosely; only affects self-test run')
1809 args = parser.parse_args()
1810 if args.test:
1811 _test()
1812 else:
1813 if not args.pickle_file:
1814 parser.print_help()
1815 else:
1816 import pprint
1817 for f in args.pickle_file:
1818 obj = load(f)
1819 pprint.pprint(obj)