You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Ashutosh Chauhan (JIRA)" <ji...@apache.org> on 2013/09/09 16:27:53 UTC

[jira] [Commented] (THRIFT-162) Thrift structures are unhashable, preventing them from being used as set elements

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

Ashutosh Chauhan commented on THRIFT-162:
-----------------------------------------

We got hit by this too. We tried to workaround this issue HIVE-4322 Than failed HIVE-4432 and HIVE-4433 Subsequently we had to roll-back this at 11th hour HIVE-4492 to unblock a release. Suffice to say it hit us badly. Would love to see this fixed in core thrift.
                
> Thrift structures are unhashable, preventing them from being used as set elements
> ---------------------------------------------------------------------------------
>
>                 Key: THRIFT-162
>                 URL: https://issues.apache.org/jira/browse/THRIFT-162
>             Project: Thrift
>          Issue Type: Bug
>          Components: Python - Compiler, Python - Library
>            Reporter: Esteve Fernandez
>            Priority: Minor
>             Fix For: 1.0
>
>         Attachments: immut-no-slots-v1.diff, immut-v2.diff, immut-v3.diff, immut-v4.diff, reading-containers.diff, thrift-162_annotiations.patch, thrift-162_v2_annotiations.patch, thrift_py_hash.patch
>
>
> Let Foo be a Thrift structure:
> struct Foo {
>  1: i32 bar
> }
> If you want to use it properly as a set element or a as a dictionary key, the autoegenerated Python code will complain about not being hashable:
> >>> f1 = Foo()
> >>> f1.bar = 1
> >>> f2 = Foo()
> >>> f2.bar = 1
> >>> f1 == f2
> True
> >>> set([f1]) & set([f2])
> set([])
> >>> d = {}
> >>> d[f1] = 2
> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
> TypeError: unhashable instance
> Since Thrift structures already implement __eq__ and __ne__, they should implement __hash__ as well. The attached patch tries to mimic the behaviour of the Java compiler, including a HashCodeBuilder class written in Python.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira