Raymond Hettinger:

> tried transforming the likes of "x in (1,2,3)" into "x in 
> frozenset([1,2,3])".  
>... There were substantial savings even if the set contained only a
single entry.

>... where x was non-hashable and it would raise a TypeError instead of
> returning False as it should.  

I read the objection as saying that it should not return False, because
an unhashable object might pretend it is equal to a hashable one in the set.

"""
    class Searchset(frozenset):
        def __contains__(self, element):
            try:
                return frozenset.__contains__(self, element)
            except TypeError:
                return False
"""
So instead of 
            return False
it should be 
            return x in frozenset.__iter__()

This would be a net loss if there were many unhashable x.  You could restrict
the iteration to x that implement a custom __eq__, if you ensured that none 
of the SearchSet elements do... but it starts to get uglier and less general.

Raymond has already look at http://www.python.org/sf/1141428, which
contains some test case patches to enforce this implicit 
"sequences always use __eq__; only mappings can short-circuit on __hash__" 
contract.

-jJ
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to