💾 Archived View for tris.fyi › pydoc › pickletools captured on 2022-04-28 at 17:32:16. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2022-03-01)
-=-=-=-=-=-=-
"Executable documentation" for the pickle module. Extensive comments about the pickle protocols and pickle-machine opcodes can be found here. Some functions meant for external use: genops(pickle) Generate all the opcodes in a pickle, as (opcode, arg, position) triples. dis(pickle, out=None, memo=None, indentlevel=4) Print a symbolic disassembly of a pickle.
doc = <member 'doc' of 'ArgumentDescriptor' objects>
n = <member 'n' of 'ArgumentDescriptor' objects>
name = <member 'name' of 'ArgumentDescriptor' objects>
reader = <member 'reader' of 'ArgumentDescriptor' objects>
arg = <member 'arg' of 'OpcodeInfo' objects>
code = <member 'code' of 'OpcodeInfo' objects>
doc = <member 'doc' of 'OpcodeInfo' objects>
name = <member 'name' of 'OpcodeInfo' objects>
proto = <member 'proto' of 'OpcodeInfo' objects>
stack_after = <member 'stack_after' of 'OpcodeInfo' objects>
stack_before = <member 'stack_before' of 'OpcodeInfo' objects>
doc = <member 'doc' of 'StackObject' objects>
name = <member 'name' of 'StackObject' objects>
obtype = <member 'obtype' of 'StackObject' objects>
decode_long(data) Decode a long from a two's complement little-endian binary string. >>> decode_long(b'') 0 >>> decode_long(b"\xff\x00") 255 >>> decode_long(b"\xff\x7f") 32767 >>> decode_long(b"\x00\xff") -256 >>> decode_long(b"\x00\x80") -32768 >>> decode_long(b"\x80") -128 >>> decode_long(b"\x7f") 127
dis(pickle, out=None, memo=None, indentlevel=4, annotate=0) Produce a symbolic disassembly of a pickle. 'pickle' is a file-like object, or string, containing a (at least one) pickle. The pickle is disassembled from the current position, through the first STOP opcode encountered. Optional arg 'out' is a file-like object to which the disassembly is printed. It defaults to sys.stdout. Optional arg 'memo' is a Python dict, used as the pickle's memo. It may be mutated by dis(), if the pickle contains PUT or BINPUT opcodes. Passing the same memo object to another dis() call then allows disassembly to proceed across multiple pickles that were all created by the same pickler with the same memo. Ordinarily you don't need to worry about this. Optional arg 'indentlevel' is the number of blanks by which to indent a new MARK level. It defaults to 4. Optional arg 'annotate' if nonzero instructs dis() to add short description of the opcode on each line of disassembled output. The value given to 'annotate' must be an integer and is used as a hint for the column where annotation should start. The default value is 0, meaning no annotations. In addition to printing the disassembly, some sanity checks are made: + All embedded opcode arguments "make sense". + Explicit and implicit pop operations have enough items on the stack. + When an opcode implicitly refers to a markobject, a markobject is actually on the stack. + A memo entry isn't referenced before it's defined. + The markobject isn't stored in the memo. + A memo entry isn't redefined.
genops(pickle) Generate all the opcodes in a pickle. 'pickle' is a file-like object, or string, containing the pickle. Each opcode in the pickle is generated, from the current pickle position, stopping after a STOP opcode is delivered. A triple is generated for each opcode: opcode, arg, pos opcode is an OpcodeInfo record, describing the current opcode. If the opcode has an argument embedded in the pickle, arg is its decoded value, as a Python object. If the opcode doesn't have an argument, arg is None. If the pickle has a tell() method, pos was the value of pickle.tell() before reading the current opcode. If the pickle is a bytes object, it's wrapped in a BytesIO object, and the latter's tell() result is used. Else (the pickle doesn't have a tell(), and it's not obvious how to query its current position) pos is None.
optimize(p) Optimize a pickle string by removing unused PUT opcodes
read_bytearray8(f) >>> import io, struct, sys >>> read_bytearray8(io.BytesIO(b"\x00\x00\x00\x00\x00\x00\x00\x00abc")) bytearray(b'') >>> read_bytearray8(io.BytesIO(b"\x03\x00\x00\x00\x00\x00\x00\x00abcdef")) bytearray(b'abc') >>> bigsize8 = struct.pack("<Q", sys.maxsize//3) >>> read_bytearray8(io.BytesIO(bigsize8 + b"abcdef")) #doctest: +ELLIPSIS Traceback (most recent call last): ... ValueError: expected ... bytes in a bytearray8, but only 6 remain
read_bytes1(f) >>> import io >>> read_bytes1(io.BytesIO(b"\x00")) b'' >>> read_bytes1(io.BytesIO(b"\x03abcdef")) b'abc'
read_bytes4(f) >>> import io >>> read_bytes4(io.BytesIO(b"\x00\x00\x00\x00abc")) b'' >>> read_bytes4(io.BytesIO(b"\x03\x00\x00\x00abcdef")) b'abc' >>> read_bytes4(io.BytesIO(b"\x00\x00\x00\x03abcdef")) Traceback (most recent call last): ... ValueError: expected 50331648 bytes in a bytes4, but only 6 remain
read_bytes8(f) >>> import io, struct, sys >>> read_bytes8(io.BytesIO(b"\x00\x00\x00\x00\x00\x00\x00\x00abc")) b'' >>> read_bytes8(io.BytesIO(b"\x03\x00\x00\x00\x00\x00\x00\x00abcdef")) b'abc' >>> bigsize8 = struct.pack("<Q", sys.maxsize//3) >>> read_bytes8(io.BytesIO(bigsize8 + b"abcdef")) #doctest: +ELLIPSIS Traceback (most recent call last): ... ValueError: expected ... bytes in a bytes8, but only 6 remain
read_decimalnl_long(f) >>> import io >>> read_decimalnl_long(io.BytesIO(b"1234L\n56")) 1234 >>> read_decimalnl_long(io.BytesIO(b"123456789012345678901234L\n6")) 123456789012345678901234
read_decimalnl_short(f) >>> import io >>> read_decimalnl_short(io.BytesIO(b"1234\n56")) 1234 >>> read_decimalnl_short(io.BytesIO(b"1234L\n56")) Traceback (most recent call last): ... ValueError: invalid literal for int() with base 10: b'1234L'
read_float8(f) >>> import io, struct >>> raw = struct.pack(">d", -1.25) >>> raw b'\xbf\xf4\x00\x00\x00\x00\x00\x00' >>> read_float8(io.BytesIO(raw + b"\n")) -1.25
read_floatnl(f) >>> import io >>> read_floatnl(io.BytesIO(b"-1.25\n6")) -1.25
read_int4(f) >>> import io >>> read_int4(io.BytesIO(b'\xff\x00\x00\x00')) 255 >>> read_int4(io.BytesIO(b'\x00\x00\x00\x80')) == -(2**31) True
read_long1(f) >>> import io >>> read_long1(io.BytesIO(b"\x00")) 0 >>> read_long1(io.BytesIO(b"\x02\xff\x00")) 255 >>> read_long1(io.BytesIO(b"\x02\xff\x7f")) 32767 >>> read_long1(io.BytesIO(b"\x02\x00\xff")) -256 >>> read_long1(io.BytesIO(b"\x02\x00\x80")) -32768
read_long4(f) >>> import io >>> read_long4(io.BytesIO(b"\x02\x00\x00\x00\xff\x00")) 255 >>> read_long4(io.BytesIO(b"\x02\x00\x00\x00\xff\x7f")) 32767 >>> read_long4(io.BytesIO(b"\x02\x00\x00\x00\x00\xff")) -256 >>> read_long4(io.BytesIO(b"\x02\x00\x00\x00\x00\x80")) -32768 >>> read_long1(io.BytesIO(b"\x00\x00\x00\x00")) 0
read_string1(f) >>> import io >>> read_string1(io.BytesIO(b"\x00")) '' >>> read_string1(io.BytesIO(b"\x03abcdef")) 'abc'
read_string4(f) >>> import io >>> read_string4(io.BytesIO(b"\x00\x00\x00\x00abc")) '' >>> read_string4(io.BytesIO(b"\x03\x00\x00\x00abcdef")) 'abc' >>> read_string4(io.BytesIO(b"\x00\x00\x00\x03abcdef")) Traceback (most recent call last): ... ValueError: expected 50331648 bytes in a string4, but only 6 remain
read_stringnl(f, decode=True, stripquotes=True) >>> import io >>> read_stringnl(io.BytesIO(b"'abcd'\nefg\n")) 'abcd' >>> read_stringnl(io.BytesIO(b"\n")) Traceback (most recent call last): ... ValueError: no string quotes around b'' >>> read_stringnl(io.BytesIO(b"\n"), stripquotes=False) '' >>> read_stringnl(io.BytesIO(b"''\n")) '' >>> read_stringnl(io.BytesIO(b'"abcd"')) Traceback (most recent call last): ... ValueError: no newline found when trying to read stringnl Embedded escapes are undone in the result. >>> read_stringnl(io.BytesIO(br"'a\n\\b\x00c\td'" + b"\n'e'")) 'a\n\\b\x00c\td'
read_stringnl_noescape(f)
read_stringnl_noescape_pair(f) >>> import io >>> read_stringnl_noescape_pair(io.BytesIO(b"Queue\nEmpty\njunk")) 'Queue Empty'
read_uint1(f) >>> import io >>> read_uint1(io.BytesIO(b'\xff')) 255
read_uint2(f) >>> import io >>> read_uint2(io.BytesIO(b'\xff\x00')) 255 >>> read_uint2(io.BytesIO(b'\xff\xff')) 65535
read_uint4(f) >>> import io >>> read_uint4(io.BytesIO(b'\xff\x00\x00\x00')) 255 >>> read_uint4(io.BytesIO(b'\x00\x00\x00\x80')) == 2**31 True
read_uint8(f) >>> import io >>> read_uint8(io.BytesIO(b'\xff\x00\x00\x00\x00\x00\x00\x00')) 255 >>> read_uint8(io.BytesIO(b'\xff' * 8)) == 2**64-1 True
read_unicodestring1(f) >>> import io >>> s = 'abcd\uabcd' >>> enc = s.encode('utf-8') >>> enc b'abcd\xea\xaf\x8d' >>> n = bytes([len(enc)]) # little-endian 1-byte length >>> t = read_unicodestring1(io.BytesIO(n + enc + b'junk')) >>> s == t True >>> read_unicodestring1(io.BytesIO(n + enc[:-1])) Traceback (most recent call last): ... ValueError: expected 7 bytes in a unicodestring1, but only 6 remain
read_unicodestring4(f) >>> import io >>> s = 'abcd\uabcd' >>> enc = s.encode('utf-8') >>> enc b'abcd\xea\xaf\x8d' >>> n = bytes([len(enc), 0, 0, 0]) # little-endian 4-byte length >>> t = read_unicodestring4(io.BytesIO(n + enc + b'junk')) >>> s == t True >>> read_unicodestring4(io.BytesIO(n + enc[:-1])) Traceback (most recent call last): ... ValueError: expected 7 bytes in a unicodestring4, but only 6 remain
read_unicodestring8(f) >>> import io >>> s = 'abcd\uabcd' >>> enc = s.encode('utf-8') >>> enc b'abcd\xea\xaf\x8d' >>> n = bytes([len(enc)]) + b'\0' * 7 # little-endian 8-byte length >>> t = read_unicodestring8(io.BytesIO(n + enc + b'junk')) >>> s == t True >>> read_unicodestring8(io.BytesIO(n + enc[:-1])) Traceback (most recent call last): ... ValueError: expected 7 bytes in a unicodestring8, but only 6 remain
read_unicodestringnl(f) >>> import io >>> read_unicodestringnl(io.BytesIO(b"abc\\uabcd\njunk")) == 'abc\uabcd' True
TAKEN_FROM_ARGUMENT1 = -2
TAKEN_FROM_ARGUMENT4 = -3
TAKEN_FROM_ARGUMENT4U = -4
TAKEN_FROM_ARGUMENT8U = -5
UP_TO_NEWLINE = -1
anyobject = any
bytearray8 = <pickletools.ArgumentDescriptor object at 0x7ff35daf2e40>
bytes1 = <pickletools.ArgumentDescriptor object at 0x7ff35daf2d80>
bytes4 = <pickletools.ArgumentDescriptor object at 0x7ff35daf2dc0>
bytes8 = <pickletools.ArgumentDescriptor object at 0x7ff35daf2e00>
bytes_types = (<class 'bytes'>, <class 'bytearray'>)
code2op = {'I': <pickletools.OpcodeInfo object at 0x7ff35daecac0>, 'J': <pickletools.OpcodeInfo object at 0x7ff35daecb80>, 'K': <pickletools.OpcodeInfo object at 0x7ff35daecbe0>, 'M': <pickletools.OpcodeInfo object at 0x7ff35daecc40>, 'L': <pickletools.OpcodeInfo object at 0x7ff35daecca0>, '\x8a': <pickletools.OpcodeInfo object at 0x7ff35daecd00>, '\x8b': <pickletools.OpcodeInfo object at 0x7ff35daecd60>, 'S': <pickletools.OpcodeInfo object at 0x7ff35daecdc0>, 'T': <pickletools.OpcodeInfo object at 0x7ff35daece20>, 'U': <pickletools.OpcodeInfo object at 0x7ff35daece80>, 'B': <pickletools.OpcodeInfo object at 0x7ff35daecee0>, 'C': <pickletools.OpcodeInfo object at 0x7ff35daecf40>, '\x8e': <pickletools.OpcodeInfo object at 0x7ff35daecfa0>, '\x96': <pickletools.OpcodeInfo object at 0x7ff35daf5040>, '\x97': <pickletools.OpcodeInfo object at 0x7ff35daf50a0>, '\x98': <pickletools.OpcodeInfo object at 0x7ff35daf5100>, 'N': <pickletools.OpcodeInfo object at 0x7ff35daf5160>, '\x88': <pickletools.OpcodeInfo object at 0x7ff35daf51c0>, '\x89': <pickletools.OpcodeInfo object at 0x7ff35daf5220>, 'V': <pickletools.OpcodeInfo object at 0x7ff35daf5280>, '\x8c': <pickletools.OpcodeInfo object at 0x7ff35daf52e0>, 'X': <pickletools.OpcodeInfo object at 0x7ff35daf5340>, '\x8d': <pickletools.OpcodeInfo object at 0x7ff35daf53a0>, 'F': <pickletools.OpcodeInfo object at 0x7ff35daf5400>, 'G': <pickletools.OpcodeInfo object at 0x7ff35daf5460>, ']': <pickletools.OpcodeInfo object at 0x7ff35daf54c0>, 'a': <pickletools.OpcodeInfo object at 0x7ff35daf5520>, 'e': <pickletools.OpcodeInfo object at 0x7ff35daf5580>, 'l': <pickletools.OpcodeInfo object at 0x7ff35daf55e0>, ')': <pickletools.OpcodeInfo object at 0x7ff35daf5640>, 't': <pickletools.OpcodeInfo object at 0x7ff35daf56a0>, '\x85': <pickletools.OpcodeInfo object at 0x7ff35daf5700>, '\x86': <pickletools.OpcodeInfo object at 0x7ff35daf5760>, '\x87': <pickletools.OpcodeInfo object at 0x7ff35daf57c0>, '}': <pickletools.OpcodeInfo object at 0x7ff35daf5820>, 'd': <pickletools.OpcodeInfo object at 0x7ff35daf5880>, 's': <pickletools.OpcodeInfo object at 0x7ff35daf58e0>, 'u': <pickletools.OpcodeInfo object at 0x7ff35daf5940>, '\x8f': <pickletools.OpcodeInfo object at 0x7ff35daf59a0>, '\x90': <pickletools.OpcodeInfo object at 0x7ff35daf5a00>, '\x91': <pickletools.OpcodeInfo object at 0x7ff35daf5a60>, '0': <pickletools.OpcodeInfo object at 0x7ff35daf5ac0>, '2': <pickletools.OpcodeInfo object at 0x7ff35daf5b20>, '(': <pickletools.OpcodeInfo object at 0x7ff35daf5b80>, '1': <pickletools.OpcodeInfo object at 0x7ff35daf5be0>, 'g': <pickletools.OpcodeInfo object at 0x7ff35daf5c40>, 'h': <pickletools.OpcodeInfo object at 0x7ff35daf5ca0>, 'j': <pickletools.OpcodeInfo object at 0x7ff35daf5d00>, 'p': <pickletools.OpcodeInfo object at 0x7ff35daf5d60>, 'q': <pickletools.OpcodeInfo object at 0x7ff35daf5dc0>, 'r': <pickletools.OpcodeInfo object at 0x7ff35daf5e20>, '\x94': <pickletools.OpcodeInfo object at 0x7ff35daf5e80>, '\x82': <pickletools.OpcodeInfo object at 0x7ff35daf5ee0>, '\x83': <pickletools.OpcodeInfo object at 0x7ff35daf5f40>, '\x84': <pickletools.OpcodeInfo object at 0x7ff35daf5fa0>, 'c': <pickletools.OpcodeInfo object at 0x7ff35daf7040>, '\x93': <pickletools.OpcodeInfo object at 0x7ff35daf70a0>, 'R': <pickletools.OpcodeInfo object at 0x7ff35daf7100>, 'b': <pickletools.OpcodeInfo object at 0x7ff35daf7160>, 'i': <pickletools.OpcodeInfo object at 0x7ff35daf71c0>, 'o': <pickletools.OpcodeInfo object at 0x7ff35daf7220>, '\x81': <pickletools.OpcodeInfo object at 0x7ff35daf7280>, '\x92': <pickletools.OpcodeInfo object at 0x7ff35daf72e0>, '\x80': <pickletools.OpcodeInfo object at 0x7ff35daf7340>, '.': <pickletools.OpcodeInfo object at 0x7ff35daf73a0>, '\x95': <pickletools.OpcodeInfo object at 0x7ff35daf7400>, 'P': <pickletools.OpcodeInfo object at 0x7ff35daf7460>, 'Q': <pickletools.OpcodeInfo object at 0x7ff35daf74c0>}
decimalnl_long = <pickletools.ArgumentDescriptor object at 0x7ff35daf2fc0>
decimalnl_short = <pickletools.ArgumentDescriptor object at 0x7ff35daf2f80>
float8 = <pickletools.ArgumentDescriptor object at 0x7ff35daf3080>
floatnl = <pickletools.ArgumentDescriptor object at 0x7ff35daf3040>
int4 = <pickletools.ArgumentDescriptor object at 0x7ff35daf2b80>
long1 = <pickletools.ArgumentDescriptor object at 0x7ff35daf30c0>
long4 = <pickletools.ArgumentDescriptor object at 0x7ff35daf3100>
markobject = mark
opcodes = [<pickletools.OpcodeInfo object at 0x7ff35daecac0>, <pickletools.OpcodeInfo object at 0x7ff35daecb80>, <pickletools.OpcodeInfo object at 0x7ff35daecbe0>, <pickletools.OpcodeInfo object at 0x7ff35daecc40>, <pickletools.OpcodeInfo object at 0x7ff35daecca0>, <pickletools.OpcodeInfo object at 0x7ff35daecd00>, <pickletools.OpcodeInfo object at 0x7ff35daecd60>, <pickletools.OpcodeInfo object at 0x7ff35daecdc0>, <pickletools.OpcodeInfo object at 0x7ff35daece20>, <pickletools.OpcodeInfo object at 0x7ff35daece80>, <pickletools.OpcodeInfo object at 0x7ff35daecee0>, <pickletools.OpcodeInfo object at 0x7ff35daecf40>, <pickletools.OpcodeInfo object at 0x7ff35daecfa0>, <pickletools.OpcodeInfo object at 0x7ff35daf5040>, <pickletools.OpcodeInfo object at 0x7ff35daf50a0>, <pickletools.OpcodeInfo object at 0x7ff35daf5100>, <pickletools.OpcodeInfo object at 0x7ff35daf5160>, <pickletools.OpcodeInfo object at 0x7ff35daf51c0>, <pickletools.OpcodeInfo object at 0x7ff35daf5220>, <pickletools.OpcodeInfo object at 0x7ff35daf5280>, <pickletools.OpcodeInfo object at 0x7ff35daf52e0>, <pickletools.OpcodeInfo object at 0x7ff35daf5340>, <pickletools.OpcodeInfo object at 0x7ff35daf53a0>, <pickletools.OpcodeInfo object at 0x7ff35daf5400>, <pickletools.OpcodeInfo object at 0x7ff35daf5460>, <pickletools.OpcodeInfo object at 0x7ff35daf54c0>, <pickletools.OpcodeInfo object at 0x7ff35daf5520>, <pickletools.OpcodeInfo object at 0x7ff35daf5580>, <pickletools.OpcodeInfo object at 0x7ff35daf55e0>, <pickletools.OpcodeInfo object at 0x7ff35daf5640>, <pickletools.OpcodeInfo object at 0x7ff35daf56a0>, <pickletools.OpcodeInfo object at 0x7ff35daf5700>, <pickletools.OpcodeInfo object at 0x7ff35daf5760>, <pickletools.OpcodeInfo object at 0x7ff35daf57c0>, <pickletools.OpcodeInfo object at 0x7ff35daf5820>, <pickletools.OpcodeInfo object at 0x7ff35daf5880>, <pickletools.OpcodeInfo object at 0x7ff35daf58e0>, <pickletools.OpcodeInfo object at 0x7ff35daf5940>, <pickletools.OpcodeInfo object at 0x7ff35daf59a0>, <pickletools.OpcodeInfo object at 0x7ff35daf5a00>, <pickletools.OpcodeInfo object at 0x7ff35daf5a60>, <pickletools.OpcodeInfo object at 0x7ff35daf5ac0>, <pickletools.OpcodeInfo object at 0x7ff35daf5b20>, <pickletools.OpcodeInfo object at 0x7ff35daf5b80>, <pickletools.OpcodeInfo object at 0x7ff35daf5be0>, <pickletools.OpcodeInfo object at 0x7ff35daf5c40>, <pickletools.OpcodeInfo object at 0x7ff35daf5ca0>, <pickletools.OpcodeInfo object at 0x7ff35daf5d00>, <pickletools.OpcodeInfo object at 0x7ff35daf5d60>, <pickletools.OpcodeInfo object at 0x7ff35daf5dc0>, <pickletools.OpcodeInfo object at 0x7ff35daf5e20>, <pickletools.OpcodeInfo object at 0x7ff35daf5e80>, <pickletools.OpcodeInfo object at 0x7ff35daf5ee0>, <pickletools.OpcodeInfo object at 0x7ff35daf5f40>, <pickletools.OpcodeInfo object at 0x7ff35daf5fa0>, <pickletools.OpcodeInfo object at 0x7ff35daf7040>, <pickletools.OpcodeInfo object at 0x7ff35daf70a0>, <pickletools.OpcodeInfo object at 0x7ff35daf7100>, <pickletools.OpcodeInfo object at 0x7ff35daf7160>, <pickletools.OpcodeInfo object at 0x7ff35daf71c0>, <pickletools.OpcodeInfo object at 0x7ff35daf7220>, <pickletools.OpcodeInfo object at 0x7ff35daf7280>, <pickletools.OpcodeInfo object at 0x7ff35daf72e0>, <pickletools.OpcodeInfo object at 0x7ff35daf7340>, <pickletools.OpcodeInfo object at 0x7ff35daf73a0>, <pickletools.OpcodeInfo object at 0x7ff35daf7400>, <pickletools.OpcodeInfo object at 0x7ff35daf7460>, <pickletools.OpcodeInfo object at 0x7ff35daf74c0>]
pybool = bool
pybuffer = buffer
pybytearray = bytearray
pybytes = bytes
pybytes_or_str = bytes_or_str
pydict = dict
pyfloat = float
pyfrozenset = frozenset
pyint = int
pyinteger_or_bool = int_or_bool
pylist = list
pylong = int
pynone = None
pyset = set
pystring = bytes_or_str
pytuple = tuple
pyunicode = str
stackslice = stackslice
string1 = <pickletools.ArgumentDescriptor object at 0x7ff35daf2d00>
string4 = <pickletools.ArgumentDescriptor object at 0x7ff35daf2d40>
stringnl = <pickletools.ArgumentDescriptor object at 0x7ff35daf2c40>
stringnl_noescape = <pickletools.ArgumentDescriptor object at 0x7ff35daf2c80>
stringnl_noescape_pair = <pickletools.ArgumentDescriptor object at 0x7ff35daf2cc0>
uint1 = <pickletools.ArgumentDescriptor object at 0x7ff35daf2b00>
uint2 = <pickletools.ArgumentDescriptor object at 0x7ff35daf2b40>
uint4 = <pickletools.ArgumentDescriptor object at 0x7ff35daf2bc0>
uint8 = <pickletools.ArgumentDescriptor object at 0x7ff35daf2c00>
unicodestring1 = <pickletools.ArgumentDescriptor object at 0x7ff35daf2ec0>
unicodestring4 = <pickletools.ArgumentDescriptor object at 0x7ff35daf2f00>
unicodestring8 = <pickletools.ArgumentDescriptor object at 0x7ff35daf2f40>
unicodestringnl = <pickletools.ArgumentDescriptor object at 0x7ff35daf2e80>