[Python-Dev] Getting values stored inside sets

Steven D'Aprano steve at pearwood.info
Fri Apr 3 16:57:21 CEST 2009

On Fri, 3 Apr 2009 11:22:02 pm Paul Moore wrote:

> I'd say that you're abusing __eq__ here. If you can say "x in s" 
> and then can't use x as if it were the actual item inserted into 
> s, then are they really "equal"? 

That's hardly unusual in Python.

>>> alist = [0, 1, 2, 3, 4]
>>> 3.0 in alist
>>> alist[3.0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers

Besides, there's a concrete use-case for retrieving the actual object 
inside the set. You can ensure that you only have one instance of any 
object with a particular value by using a cache like this:

_cache = {}
def cache(obj):
    if obj in _cache: return _cache[obj]
    _cache[obj] = obj
    return obj

Arguably, it would be neater if the cache was a set rather than a dict, 
thus saving one pointer per item, but of course that would rely on a 
change on set behaviour.

Steven D'Aprano

More information about the Python-Dev mailing list