[ https://issues.apache.org/jira/browse/THRIFT-3388?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15005626#comment-15005626 ]
Michi Mutsuzaki commented on THRIFT-3388: ----------------------------------------- +1 for reverting https://issues.apache.org/jira/browse/THRIFT-2621 There was a good discussion related to this topic in https://issues.apache.org/jira/browse/THRIFT-162 . The consensus there seems to be to add an "immutable" annotation. It seems like a reasonable approach to me. > 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)