Python 3.0 - is this true?

Steven D'Aprano steven at REMOVE.THIS.cybersource.com.au
Mon Nov 10 20:10:00 EST 2008


On Mon, 10 Nov 2008 12:51:51 +0000, Duncan Grisby wrote:

> I have an object database written in Python. It, like Python, is
> dynamically typed. It heavily relies on being able to sort lists where
> some of the members are None. To some extent, it also sorts lists of
> other mixed types. It will be very hard to migrate this aspect of it to
> Python 3.

No, it is "very hard" to sort *arbitrary* objects consistently. If it 
appears to work in Python 2.x that's because you've been lucky to never 
need to sort objects that cause it to break. 

But if you have a list consisting of only a few types, then it is not 
that hard to come up with a strategy for sorting them. All you need is a 
key function. Suppose that you want to sort a list of numbers and None. 
Then this should do what you expect:

# untested
alist.sort(key=lambda x: (0, -99) if x is None else (1, x))


Another suggestion would be a key function that wraps the objects in a 
"compare anything" proxy class. This is very hard to get right for 
arbitrary types, which is why sorting in Python 2.x apparently contains 
subtle bugs. But if you control the types that can appear in your list, 
it's much simpler. I leave the full details as an exercise, but the heart 
of it will be something like this:

class SortableProxy(object):
    # define the order of types
    types = [NoneType, str, int, MyWackyObjectClass]
    def __lt__(self, other):
        if type(self.proxy) == type(other.proxy):
             return self.proxy < other.proxy
        p = self.types.index(type(self.proxy)
        q = self.types.index(type(other.proxy)
        return p < q

I leave it to you to sort out the remaining details (pun intended).



-- 
Steven



More information about the Python-list mailing list