On Sat, 30 Jul 2005 23:37:04 +1000, Steven D'Aprano <[EMAIL PROTECTED]> wrote:

>On Sat, 30 Jul 2005 14:20:50 +0200, tiissa wrote:
>
>> Steven D'Aprano wrote:
>>> Playing around with comparisons of functions (don't ask), I discovered an
>>> interesting bit of unintuitive behaviour:
>>> 
>>>>>>a = lambda y: y
>>>>>>b = lambda y: y
>>>>>>a
>>> <function <lambda> at 0xf70598ec>
>>>>>>b
>>> <function <lambda> at 0xf7059844>
>>>>>>a < b
>>> False
>>> 
>>> So I'm puzzled about how Python compares the two.
>> 
>> Seems to me the object addresses are compared in this case. But I'm too 
>> lazy to check it in the source. ;)
>
>Strangely enough, I'm lazy enough to not check the source too :-)
>
>Actually, more to the point, I don't read C, so even if I did check the
>source, I wouldn't know what it was trying to tell me.
>
>> However, the doc [1] warns you about such comparisons: """Most other
>> types compare unequal unless they are the same object; the choice
>> whether one object is considered smaller or larger than another one is
>> made arbitrarily but consistently within one execution of a program."""
>
>I am aware of that. That's a wart.
>
What if rich sorting "measured" the objects it was sorting, to form a 
measurement tuple
of primitive types, so that you'd wind up sorting as if by a decorated list 
with the
measurement tuple as the decoration, e.g., (an I think having to wrap complex 
for sorting
is CWrap ;-)

Just a sketch to illustrate an idea for sorting...

----< richlysorted.py >-------------------------------------
def richlysorted(seq):
    return ((type(v) is CWrap and [v.v] or [v])[0]
                for d,v in sorted(measure_dec(seq)))

INT = LONG = FLOAT = 0
COMPLEX = 1
STR = 2
UNICODE = 3
FUNCTION = 4
TYPE = 5
DEFAULT = 6

type_sort_order = dict(
    int=INT, long=LONG, float=FLOAT,
    complex=COMPLEX,
    str=STR, unicode=UNICODE,
    function=FUNCTION,
    type=TYPE)

class CWrap(object):
    def __init__(self, v): self.v=v
    def __eq__(self, other): return True
    
def measure_dec(seq):
    for v in seq:
        sort_priority = type_sort_order.get(type(v).__name__, DEFAULT)
        if sort_priority == COMPLEX:
            yield (sort_priority, v.real, v.imag), CWrap(v)
        elif sort_priority <= UNICODE:
            yield (sort_priority,), v
        elif sort_priority == FUNCTION:
            yield (sort_priority, v.func_name, v.func_code.co_argcount), v
        elif sort_priority == TYPE:
            yield (sort_priority, v.__name__), v
        else:
            yield (sort_priority, type(v).__name__, repr(v)) , v

def test():
    class C: pass
    class D(object): pass
    def foo(): pass
    def bar(a,b): pass
    tbs = [1, -1.0, 1+0j, 2j, lambda x:x, test, measure_dec, lambda:None,
         foo, bar, D, D(), C(), C, 2**32, -2**32]

    for tup in zip(tbs, measure_dec(tbs)):
        print '%35s | %-s' % tup
    print '%s\nSorted:'% (50*'-')
    for item in richlysorted(tbs):
        print '%35s' % item

if __name__ == '__main__':
   test()
------------------------------------------------------------

[16:57] C:\pywk\ut>py24 richlysorted.py
                                  1 | ((0,), 1)
                               -1.0 | ((0,), -1.0)
                             (1+0j) | ((1, 1.0, 0.0), <__main__.CWrap object at 
0x02F00B2C>)
                                 2j | ((1, 0.0, 2.0), <__main__.CWrap object at 
0x02F00B4C>)
  <function <lambda> at 0x02EE8DF4> | ((4, '<lambda>', 1), <function <lambda> 
at 0x02EE8DF4>)
      <function test at 0x02EE8D4C> | ((4, 'test', 0), <function test at 
0x02EE8D4C>)
<function measure_dec at 0x02EE8CA4> | ((4, 'measure_dec', 1), <function 
measure_dec at 0x02EE8C
A4>)
  <function <lambda> at 0x02EE8E2C> | ((4, '<lambda>', 0), <function <lambda> 
at 0x02EE8E2C>)
       <function foo at 0x02EE8D84> | ((4, 'foo', 0), <function foo at 
0x02EE8D84>)
       <function bar at 0x02EE8DBC> | ((4, 'bar', 2), <function bar at 
0x02EE8DBC>)
               <class '__main__.D'> | ((5, 'D'), <class '__main__.D'>)
  <__main__.D object at 0x02F0044C> | ((6, 'D', '<__main__.D object at 
0x02F0044C>'), <__main__.
D object at 0x02F0044C>)
<__main__.C instance at 0x02F004CC> | ((6, 'instance', '<__main__.C instance at 
0x02F004CC>'), <
__main__.C instance at 0x02F004CC>)
                         __main__.C | ((6, 'classobj', '<class __main__.C at 
0x02EE78CC>'), <cla
ss __main__.C at 0x02EE78CC>)
                         4294967296 | ((0,), 4294967296L)
                        -4294967296 | ((0,), -4294967296L)
--------------------------------------------------
Sorted:
                        -4294967296
                               -1.0
                                  1
                         4294967296
                                 2j
                             (1+0j)
  <function <lambda> at 0x02EE8E2C>
  <function <lambda> at 0x02EE8DF4>
       <function bar at 0x02EE8DBC>
       <function foo at 0x02EE8D84>
<function measure_dec at 0x02EE8CA4>
      <function test at 0x02EE8D4C>
               <class '__main__.D'>
  <__main__.D object at 0x02F0044C>
                         __main__.C
<__main__.C instance at 0x02F004CC>

Regards,
Bengt Richter
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to