Freezing

James Stroud jstroud at ucla.edu
Fri Jan 13 19:26:22 EST 2006


bearophileHUGS at lycos.com wrote:
> Dicts and sets require immutable keys, like tuples or frozensets

Not really...

def freeze(anobj):
   """returns a new hashable object"""
   import copy
   try: hash(anobj)
   except: pass
   else: return copy.deepcopy(anobj)
   class FrozenType(type):
     def __new__(cls, name, bases, dct):
       return type.__new__(cls, name, bases, dct)
     def __init__(cls, name, bases, dct):
       super(FrozenType, cls).__init__(name, bases, dct)
   def hashself(self): return hash(repr(self))
   name = 'Frozen_%s' % anobj.__class__.__name__
   bases = (anobj.__class__,)
   dct = dict(anobj.__class__.__dict__)
   dct['__hash__'] = hashself
   cls = FrozenType(name, bases, dct)
   return cls(anobj)

def test():
   class bob:
     def doit(self): print 1,2,3,4
   # amutable = bob()
   # amutable = [1,2,3,4]
   amutable = set((1,2,3,4))
   # amutable = {1:2, 3:4}
   frozen = freeze(amutable)
   print frozen
   print type(frozen)
   adict = {frozen:100}
   frozen2 = freeze(amutable)
   print adict[frozen2]
   print frozen is frozen2
   print frozen == frozen2

test()



More information about the Python-list mailing list