[
https://issues.apache.org/jira/browse/THRIFT-162?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12638519#action_12638519
]
Esteve Fernandez commented on THRIFT-162:
-----------------------------------------
bq. I'm not sure if that is any better, because you could just change the
object, which would change the return value of returnImmutable.
Well, if you return a new (immutable) instance, it won't depend on the original
object. Of course, it won't reflect the original object, as it may evolve
independently.
bq. I think Java has this same issue, but the Java convention is to trust the
developer not to mutate map keys. In your use case, I would suggest using a
dict from uuid to structure.
The problem here, is that dict are mutable as well, they are unhashable:
>>> d1 = dict(a=1)
>>> set([d1])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: dict objects are unhashable
So, the only workaround is to use a tuple (as they're immutable) holding two
integers to represent uuids, but it's kinda ugly.
> 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: Compiler (Python), Library (Python)
> Reporter: Esteve Fernandez
> Priority: Minor
> Attachments: 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.
-
You can reply to this email to add a comment to the issue online.