[Python-Dev] Getting values stored inside sets
Paul Moore
p.f.moore at gmail.com
Fri Apr 3 14:22:02 CEST 2009
2009/4/3 Hrvoje Niksic <hrvoje.niksic at avl.com>:
> I've stumbled upon an oddity using sets. It's trivial to test if a value is
> in the set, but it appears to be impossible to retrieve a stored value,
> other than by iterating over the whole set. Let me describe a concrete use
> case.
>
> Imagine a set of objects identified by some piece of information, such as a
> "key" slot (guaranteed to be constant for any particular element). The
> object could look like this:
>
> class Element(object):
> def __init__(self, key):
> self.key = key
> def __eq__(self, other):
> return self.key == other
> def __hash__(self):
> return hash(self.key)
> # ...
>
> Now imagine a set "s" of such objects. I can add them to the set:
>
>>>> s = set()
>>>> s.add(Element('foo'))
>>>> s.add(Element('bar'))
>
> I can test membership using the keys:
>
>>>> 'foo' in s
> True
>>>> 'blah' in s
> False
>
> But I can't seem to find a way to retrieve the element corresponding to
> 'foo', at least not without iterating over the entire set. Is this an
> oversight or an intentional feature? Or am I just missing an obvious way to
> do this?
My instinct is that it's intentional. 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"?
Using a dict seems like the correct answer. I certainly don't think
it's worth complicating the set interface to cover this corner case.
Paul.
More information about the Python-Dev
mailing list