Guest User

Untitled

a guest
May 21st, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.81 KB | None | 0 0
  1. """FrozenDict: An immutable version of a dictionary
  2.  
  3. Created once with the data at initialization, and then never modified.
  4.  
  5. Attempts to modify data on this dictionary, will return a new instance, without
  6. affecting the current object.
  7. """
  8. import unittest
  9.  
  10. from collections import UserDict
  11.  
  12.  
  13. class FrozenDict(UserDict):
  14. def __init__(self, original_dict: dict):
  15. self.data = original_dict
  16.  
  17. def __setitem__(self, key, value):
  18. raise TypeError("Can't modify immutable dictionary!")
  19.  
  20. def update(self, *args, **kwargs):
  21. copied = self.data.copy()
  22. copied.update(*args, **kwargs)
  23. return copied
  24.  
  25. def pop(self, *args, **kwargs):
  26. copied = self.data.copy()
  27. extracted_key = copied.pop(*args, **kwargs)
  28. return copied, extracted_key
  29.  
  30.  
  31. class TestFrozenDict(unittest.TestCase):
  32. """run with:
  33. python -m unittest <file>
  34. """
  35. def setUp(self):
  36. self.original_dict = FrozenDict({
  37. "persistent": "value",
  38. "removed": "to be deleted",
  39. "updated": "to be updated",
  40. })
  41.  
  42. def test_set_key(self):
  43. with self.assertRaises(TypeError):
  44. self.original_dict["updated"] = 44
  45.  
  46. def _compare_updated_dicts(self, new):
  47. expected_new = {
  48. "persistent": "value",
  49. "removed": "to be deleted",
  50. "updated": "new value for updated",
  51. }
  52. expected_original = {
  53. "persistent": "value",
  54. "removed": "to be deleted",
  55. "updated": "to be updated",
  56. }
  57. self.assertEqual(new, expected_new)
  58. self.assertEqual(self.original_dict, expected_original)
  59.  
  60. def test_update_kwargs(self):
  61. """Update returns a new copy, leaving the original unmodified."""
  62. new = self.original_dict.update(updated="new value for updated")
  63. self._compare_updated_dicts(new)
  64.  
  65. def test_update_from_dict(self):
  66. new = self.original_dict.update({"updated": "new value for updated"})
  67. self._compare_updated_dicts(new)
  68.  
  69. def test_update_from_sequence(self):
  70. new = self.original_dict.update(
  71. (("updated", "new value for updated"), )
  72. )
  73. self._compare_updated_dicts(new)
  74.  
  75. def test_pop(self):
  76. new_dict, removed = self.original_dict.pop("removed")
  77.  
  78. self.assertEqual(
  79. new_dict,
  80. {"persistent": "value", "updated": "to be updated"}
  81. )
  82. self.assertEqual(removed, "to be deleted")
  83.  
  84. def test_pop_with_default(self):
  85. new, removed = self.original_dict.pop(
  86. "something that's not there", "default"
  87. )
  88. self.assertEqual(new, self.original_dict)
  89. self.assertEqual(removed, "default")
  90.  
  91. def test_pop_raises_keyerror(self):
  92. with self.assertRaises(KeyError):
  93. self.original_dict.pop("key that's not there")
Add Comment
Please, Sign In to add comment