recursion in __cmp__

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Victor Safronovich

    #1

    recursion in __cmp__

    please comment this
    Python 2.2.3 (#42, May 30 2003, 18:12:08) [MSC 32 bit (Intel)] on win32[color=blue][color=green][color=darkred]
    >>> class A:[/color][/color][/color]
    def __cmp__(self, other):
    print '%s|%s' %(`self`, `other`)
    return cmp(self, other)
    [color=blue][color=green][color=darkred]
    >>> a = A()
    >>> cmp(a,A())[/color][/color][/color]
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
    0[color=blue][color=green][color=darkred]
    >>> cmp(a,5)[/color][/color][/color]
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    <__main__.A instance at 0x00989838>|5
    0
  • Alex Martelli

    #2
    Re: recursion in __cmp__

    Victor Safronovich <vsafronovich@n aumen.ru> wrote:
    [color=blue]
    > please comment this
    > Python 2.2.3 (#42, May 30 2003, 18:12:08) [MSC 32 bit (Intel)] on win32[color=green][color=darkred]
    > >>> class A:[/color][/color]
    > def __cmp__(self, other):
    > print '%s|%s' %(`self`, `other`)
    > return cmp(self, other)[/color]

    What is there to comment? This is obviously and blatantly recursive,
    since cmp(a, b) delegates back to a.__cmp__(b) [[for classic classes;
    for a newstyle class it would be type(a).__cmp__ (a, b) with the same
    recursive effect in this case]].

    Just like the simpler example: def __len__(self): return len(self)


    Alex

    Comment

    • John Doe

      #3
      Re: recursion in __cmp__

      Really Victor,
      no one comments on old versions. Try it on 2.3.

      Dan

      On Fri, 05 Nov 2004 00:45:28 -0800, Victor Safronovich wrote:
      [color=blue]
      > please comment this
      > Python 2.2.3 (#42, May 30 2003, 18:12:08) [MSC 32 bit (Intel)] on win32[color=green][color=darkred]
      >>>> class A:[/color][/color]
      > def __cmp__(self, other):
      > print '%s|%s' %(`self`, `other`)
      > return cmp(self, other)
      >[color=green][color=darkred]
      >>>> a = A()
      >>>> cmp(a,A())[/color][/color]
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > <__main__.A instance at 0x00989838>|<__ main__.A instance at 0x0097D120>
      > 0[color=green][color=darkred]
      >>>> cmp(a,5)[/color][/color]
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > <__main__.A instance at 0x00989838>|5
      > 0[/color]

      Comment

      • Peter Otten

        #4
        Re: recursion in __cmp__

        Victor Safronovich wrote:
        [color=blue]
        > please comment this
        > Python 2.2.3 (#42, May 30 2003, 18:12:08) [MSC 32 bit (Intel)] on win32[color=green][color=darkred]
        >>>> class A:[/color][/color]
        > def __cmp__(self, other):
        > print '%s|%s' %(`self`, `other`)
        > return cmp(self, other)
        >[color=green][color=darkred]
        >>>> a = A()
        >>>> cmp(a,A())[/color][/color][/color]

        Does it get clearer with the following reimplementatio n of cmp()?
        [color=blue][color=green][color=darkred]
        >>> class A:[/color][/color][/color]
        .... def __cmp__(self, other):
        .... return mycompare(self, other)
        ....[color=blue][color=green][color=darkred]
        >>> def mycompare(a, b):[/color][/color][/color]
        .... try:
        .... return a.__cmp__(b)
        .... except AttributeError:
        .... return mycompare(id(a) , id(b))
        ....[color=blue][color=green][color=darkred]
        >>> mycompare(A(), A())[/color][/color][/color]
        Traceback (most recent call last):
        File "<stdin>", line 1, in ?
        File "<stdin>", line 3, in mycompare
        File "<stdin>", line 3, in __cmp__
        File "<stdin>", line 3, in mycompare
        File "<stdin>", line 3, in __cmp__
        [snip]
        File "<stdin>", line 3, in __cmp__
        File "<stdin>", line 3, in mycompare
        RuntimeError: maximum recursion depth exceeded[color=blue][color=green][color=darkred]
        >>>[/color][/color][/color]

        Peter

        Comment

        Working...