1 | #!/usr/bin/env python3
|
2 | from __future__ import print_function
|
3 |
|
4 | import pickle
|
5 | import sys
|
6 |
|
7 |
|
8 | class Base(object):
|
9 | def __init__(self, n):
|
10 | # IMPORTANT: The pickle has instructions to make
|
11 | # self.__dict__ = {'n': # 10042}.
|
12 | # It doesn't call the constructor or redo this computation.
|
13 | self.n = n + 43
|
14 |
|
15 | # Note: There are no runtime instructions for inheritance in pickle.
|
16 | class Foo(Base):
|
17 |
|
18 | def __init__(self, n):
|
19 | Base.__init__(self, n)
|
20 | # look what happens when there are nested objects
|
21 | # the graph is walked
|
22 | self.m1 = Base(99)
|
23 | #self.m2 = Base(99)
|
24 |
|
25 | def __repr__(self):
|
26 | return '<Foo %d>' % self.n
|
27 |
|
28 |
|
29 | def PickleInstance(protocol, out_f):
|
30 | f = Foo(10000)
|
31 | print(f)
|
32 |
|
33 | i = pickle.dumps(f, protocol=protocol)
|
34 | c = pickle.dumps(Foo, protocol=protocol)
|
35 |
|
36 | print(len(i)) # 101 in protocol 0, 36 in protocol 2
|
37 | print(len(c)) # 18 bytes in portocl 0, 19 in protocol 2
|
38 |
|
39 | print(repr(i))
|
40 | print(repr(c))
|
41 |
|
42 |
|
43 | out_f.write(i)
|
44 |
|
45 |
|
46 | def PickleData(protocol, out_f):
|
47 | d = {'key': 'str', 'k2': ['value1', 42, False], 'bool': True, 'float': 0.1}
|
48 |
|
49 | # Test out GRAPH
|
50 | d['self'] = d
|
51 |
|
52 | i = pickle.dumps(d, protocol=protocol)
|
53 |
|
54 | out_f.write(i)
|
55 |
|
56 |
|
57 |
|
58 | def main(argv):
|
59 |
|
60 | action = argv[1]
|
61 | protocol = int(argv[2])
|
62 | out_path = argv[3]
|
63 |
|
64 | if action == 'instance':
|
65 | with open(out_path, 'wb') as f:
|
66 | PickleInstance(protocol, f)
|
67 |
|
68 | elif action == 'pure-data':
|
69 | with open(out_path, 'wb') as f:
|
70 | PickleData(protocol, f)
|
71 |
|
72 | else:
|
73 | raise RuntimeError(action)
|
74 |
|
75 |
|
76 | main(sys.argv)
|
77 |
|