Michi Mutsuzaki created THRIFT-3388:
---------------------------------------

             Summary: hash doesn't work on set/list
                 Key: THRIFT-3388
                 URL: https://issues.apache.org/jira/browse/THRIFT-3388
             Project: Thrift
          Issue Type: Bug
          Components: Python - Compiler
    Affects Versions: 0.9.3
         Environment: ubuntu 14.04 python 2.6.9
            Reporter: Michi Mutsuzaki


THRIFT-2621 added hash function to thrift generated classes, but certain types 
like set or list cannot be hashed. One solution is to convert them to immutable 
types (fronzenset, tuple) before calling hash() on them.

{noformat}
$ thrift -version
Thrift version 0.9.3

$ cat test.thrift
struct Test {
  1: required set<string> test
}

$ thrift --gen py -out . test.thrift

$ cat test.py    
from test.ttypes import Test
from thrift.protocol import TBinaryProtocol
from thrift.transport import TTransport

# serialize
t = Test(test=set(["a"]))
tout = TTransport.TMemoryBuffer()
pout = TBinaryProtocol.TBinaryProtocol(tout)
t.write(pout)

# deserialize
tin = TTransport.TMemoryBuffer(tout.getvalue())
pin = TBinaryProtocol.TBinaryProtocol(tin)
t2 = Test()
t2.read(pin)

# put the deserialized object to a set
a = set([t2])

$ python test.py
Traceback (most recent call last):
  File "test.py", line 18, in <module>
    a = set([t2])
  File "/tmp/test/test/ttypes.py", line 81, in __hash__
    value = (value * 31) ^ hash(self.test)
TypeError: unhashable type: 'set'
{noformat}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to