[ 
https://issues.apache.org/jira/browse/THRIFT-3388?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15007397#comment-15007397
 ] 

Tejal Desai commented on THRIFT-3388:
-------------------------------------

Thank you all for chiming in!
I was about to propose a patch which would cover all the unhashable allowed 
types, by converting them to corresponding immutable and then hashing them
1. set 
2. map
3. lists

However, going through discussion over Thrift-162, seems like reverting the 
patch is the right way. 

> 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