| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- class ActorCpnt:
- def __init__(self, actor, id):
- self.actor = actor
- self.id = id
-
- class Actor:
- def __init__(self, id):
- self.cpnts = [ActorCpnt(self, id)]
- import pickle as pkl
- a = Actor(123)
- x = pkl.dumps(a)
- b = pkl.loads(x)
- assert isinstance(b, Actor)
- assert len(b.cpnts) == 1
- assert b.cpnts[0].actor is b
- assert b.cpnts[0].id == 123
- # self-referencing list
- a = [1, 2]
- a.append(a)
- b = pkl.loads(pkl.dumps(a))
- assert b[0] == 1 and b[1] == 2
- assert b[2] is b
- # self-referencing dict
- d = {'k': 1}
- d['me'] = d
- e = pkl.loads(pkl.dumps(d))
- assert e['k'] == 1
- assert e['me'] is e
- # two objects referencing each other
- class P:
- def __init__(self):
- self.q = None
- class Q:
- def __init__(self):
- self.p = None
- p = P()
- q = Q()
- p.q = q
- q.p = p
- p2 = pkl.loads(pkl.dumps(p))
- assert isinstance(p2, P)
- assert isinstance(p2.q, Q)
- assert p2.q.p is p2
- # object -> dict -> object
- class Node:
- def __init__(self):
- self.edges = {}
- n = Node()
- n.edges['self'] = n
- n2 = pkl.loads(pkl.dumps(n))
- assert n2.edges['self'] is n2
- # longer cycle: list -> dict -> list
- L = []
- D = {'L': L}
- L.append(D)
- L2 = pkl.loads(pkl.dumps(L))
- assert L2[0]['L'] is L2
- # a shared object appearing both inside and outside a cycle
- class Box:
- def __init__(self, v):
- self.v = v
- shared = Box(7)
- root = {'a': shared, 'b': [shared]}
- root['self'] = root
- r = pkl.loads(pkl.dumps(root))
- assert r['self'] is r
- assert r['a'] is r['b'][0]
- assert r['a'].v == 7
- # empty containers
- assert pkl.loads(pkl.dumps([])) == []
- assert pkl.loads(pkl.dumps({})) == {}
- class Empty:
- pass
- assert isinstance(pkl.loads(pkl.dumps(Empty())), Empty)
|