905_pickle1.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. class ActorCpnt:
  2. def __init__(self, actor, id):
  3. self.actor = actor
  4. self.id = id
  5. class Actor:
  6. def __init__(self, id):
  7. self.cpnts = [ActorCpnt(self, id)]
  8. import pickle as pkl
  9. a = Actor(123)
  10. x = pkl.dumps(a)
  11. b = pkl.loads(x)
  12. assert isinstance(b, Actor)
  13. assert len(b.cpnts) == 1
  14. assert b.cpnts[0].actor is b
  15. assert b.cpnts[0].id == 123
  16. # self-referencing list
  17. a = [1, 2]
  18. a.append(a)
  19. b = pkl.loads(pkl.dumps(a))
  20. assert b[0] == 1 and b[1] == 2
  21. assert b[2] is b
  22. # self-referencing dict
  23. d = {'k': 1}
  24. d['me'] = d
  25. e = pkl.loads(pkl.dumps(d))
  26. assert e['k'] == 1
  27. assert e['me'] is e
  28. # two objects referencing each other
  29. class P:
  30. def __init__(self):
  31. self.q = None
  32. class Q:
  33. def __init__(self):
  34. self.p = None
  35. p = P()
  36. q = Q()
  37. p.q = q
  38. q.p = p
  39. p2 = pkl.loads(pkl.dumps(p))
  40. assert isinstance(p2, P)
  41. assert isinstance(p2.q, Q)
  42. assert p2.q.p is p2
  43. # object -> dict -> object
  44. class Node:
  45. def __init__(self):
  46. self.edges = {}
  47. n = Node()
  48. n.edges['self'] = n
  49. n2 = pkl.loads(pkl.dumps(n))
  50. assert n2.edges['self'] is n2
  51. # longer cycle: list -> dict -> list
  52. L = []
  53. D = {'L': L}
  54. L.append(D)
  55. L2 = pkl.loads(pkl.dumps(L))
  56. assert L2[0]['L'] is L2
  57. # a shared object appearing both inside and outside a cycle
  58. class Box:
  59. def __init__(self, v):
  60. self.v = v
  61. shared = Box(7)
  62. root = {'a': shared, 'b': [shared]}
  63. root['self'] = root
  64. r = pkl.loads(pkl.dumps(root))
  65. assert r['self'] is r
  66. assert r['a'] is r['b'][0]
  67. assert r['a'].v == 7
  68. # empty containers
  69. assert pkl.loads(pkl.dumps([])) == []
  70. assert pkl.loads(pkl.dumps({})) == {}
  71. class Empty:
  72. pass
  73. assert isinstance(pkl.loads(pkl.dumps(Empty())), Empty)