Ordered Sets

Scott David Daniels Scott.Daniels at Acm.Org
Thu Mar 26 16:20:17 CET 2009


pataphor wrote:
> Raymond Hettinger wrote:
> 
>> Right.  Here's a link to a weakref version (though I think the
>> previous __del__ version also does the trick):
>>
>>     http://code.activestate.com/recipes/576696/
> 
> Interesting. But how about this one? Does it also have the reference 
> problem? By the way collections.MutableSet needs python >= 2.6
...

> class OrderedSet(collections.MutableSet):
>     'Set that remembers the order elements were added'
>     # Big-O running times for all methods are the same as for regular sets.
> 
>     def __init__(self, iterable=None):
>         self.__map = {}                     # key --> [prev,key,next]
>         if iterable is not None:
>             self |= iterable
...
>     def add(self, key):
>         if not self.__map:
>             self.start = key
>             self.__map = {key: [key,key,key]}
...
Two responses:
(1) No, it doesn't have the reference problem, but it does replace
     a reference with map lookup (at a performance cost).
and
(2) Why, oh why, do people feel so comforted adding double_underscores
     to data structures?  If I want to inherit from your mapping in order
     to log the attempts to discard a key not actually in the set, I
     have to either us the nasty name mangling to get at self.__map, or
     name my subclass OrderedSet and take advantage of a not-guaranteed
     name mangling.  What on earth makes you unwilling to go with "_map"
     and credit your code's consumers with a bit of common sense?

Sorry, this latter rant has been building up for a while (spurred on by
a sojourn into the unittest code where they have the private disease in
spades.

--Scott David Daniels
Scott.Daniels at Acm.Org



More information about the Python-list mailing list