Guest User

Untitled

a guest
Oct 17th, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.79 KB | None | 0 0
  1. from abc import ABCMeta, abstractmethod
  2.  
  3.  
  4. def freeze(x):
  5. return Freezable.summon[type(x)].freeze(x)
  6.  
  7.  
  8. class FreezableSummoner(object):
  9.  
  10. _not_found = object()
  11.  
  12. def __getitem__(self, t):
  13. v = Freezable._registry.get(t, self._not_found)
  14. if v is self._not_found:
  15. raise TypeError('{} is not Freezable'.format(t))
  16. return v
  17.  
  18.  
  19. class FreezableRegistrar(object):
  20. _typ = None
  21.  
  22. def __call__(self, x):
  23. if not self._typ:
  24. if not isinstance(x, type):
  25. raise TypeError
  26. res = FreezableRegistrar()
  27. res._typ = x
  28. return res
  29. if not callable(x):
  30. raise TypeError
  31. class Derived(Freezable):
  32. def freeze(self, v):
  33. return x(v)
  34. Derived.__name__ = 'Freezable[{}]'.format(self._typ)
  35. Freezable._registry[self._typ] = Derived()
  36. return x
  37.  
  38.  
  39. class Freezable(object):
  40. __metaclass__ = ABCMeta
  41.  
  42. _registry = {}
  43.  
  44. register = FreezableRegistrar()
  45.  
  46. summon = FreezableSummoner()
  47.  
  48. @abstractmethod
  49. def freeze(self, v):
  50. pass
  51.  
  52.  
  53. class FrozenDict(object):
  54. def __init__(self, underlying):
  55. self._underlying = underlying
  56.  
  57. def get(self, k):
  58. return self._underlying.get(k)
  59.  
  60. def items(self):
  61. return self._underlying.items()
  62.  
  63. def keys(self):
  64. return self._underlying.keys()
  65.  
  66. def values(self):
  67. return self._underlying.values()
  68.  
  69. def __getitem__(self, k):
  70. return self._underlying[k]
  71.  
  72. def __iter__(self):
  73. return iter(self._underlying)
  74.  
  75. def __repr__(self):
  76. return 'frozen({})'.format(self._underlying)
  77.  
  78.  
  79. @Freezable.register(dict)
  80. def freezable_dict(d):
  81. return FrozenDict({freeze(k): freeze(v) for k, v in d.items()})
  82.  
  83.  
  84. Freezable.register(str)(lambda x: x)
Add Comment
Please, Sign In to add comment