JH wrote: > Hi > > Can anyone explain to me why the following codes do not work? I want to > try out using __cmp__ method to change the sorting order. I subclass > the str and override the __cmp__ method so the strings can be sorted by > the lengh. I expect the shortest string should be in the front. Thanks
AFAIK (please a Guru correct me if I'm wrong), __cmp__ is used as a fallback when other comparison operators ( __lt__ etc) are not implemented : >>> class MyStr(str): ... def __lt__(self, other): ... return len(self) < len(other) ... def __le__(self, other): ... return len(self) <= len(other) ... def __gt__(self, other): ... return len(self) > len(other) ... def __ge__(self, other): ... return len(self) >= len(other) ... >>> items = [MyStr("lolo lala"), MyStr("lolo"), MyStr("alal"), MyStr("a")] >>> sorted(items) ['a', 'lolo', 'alal', 'lolo lala'] >>> But anyway, all this is a WTF. Just using the correct params for sorted is enough: >>> items2 = ['lolo lala', 'lolo', 'alal', 'a'] >>> sorted(items2, key=len) ['a', 'lolo', 'alal', 'lolo lala'] > >>>>class myStr(str): > > def __init__(self, s): > str.__init__(self, s) # Ensure super class is initialized This is useless. If you don't override it, parent's init will be called anyway. (snip) HTH -- bruno desthuilliers python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for p in '[EMAIL PROTECTED]'.split('@')])" -- http://mail.python.org/mailman/listinfo/python-list