Problem with __str__ if baseclass is list

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Edward C. Jones

    Problem with __str__ if baseclass is list

    #! /usr/bin/env python

    class A(list):
    def __init__(self, alist, n):
    list.__init__(s elf, alist)
    self.n = n

    def __str__(self):
    return 'AS(%s, %i)' % (list.__str__(s elf), self.n)

    def __repr__(self):
    return 'AR(%s, %i)' % (list.__repr__( self), self.n)

    a = A(['x', 'y'], 7)

    print 1, a
    print 2, repr(a)
    print 3, list.__str__(a)
    print 4, list.__repr__(a )

    """
    The output is:

    1 AS(AR(['x', 'y'], 7), 7)
    2 AR(['x', 'y'], 7)
    3 AR(['x', 'y'], 7)
    4 ['x', 'y']

    Why is list.__str__(a) == "AR(['x', 'y'], 7)"?

    Note: The problem goes away if "list.__str__(a )" is replaced with
    "list.__repr__( self)".
    """
  • Serge Orlov

    #2
    Re: Problem with __str__ if baseclass is list

    Edward C. Jones wrote:[color=blue]
    > #! /usr/bin/env python
    >
    > class A(list):
    > def __init__(self, alist, n):
    > list.__init__(s elf, alist)
    > self.n = n
    >
    > def __str__(self):
    > return 'AS(%s, %i)' % (list.__str__(s elf), self.n)
    >
    > def __repr__(self):
    > return 'AR(%s, %i)' % (list.__repr__( self), self.n)
    >
    > a = A(['x', 'y'], 7)
    >
    > print 1, a
    > print 2, repr(a)
    > print 3, list.__str__(a)
    > print 4, list.__repr__(a )
    >
    > """
    > The output is:
    >
    > 1 AS(AR(['x', 'y'], 7), 7)
    > 2 AR(['x', 'y'], 7)
    > 3 AR(['x', 'y'], 7)
    > 4 ['x', 'y']
    >
    > Why is list.__str__(a) == "AR(['x', 'y'], 7)"?[/color]

    Because it's coded like this:
    def __str__(self):
    return repr(self)

    That implies str(x) == repr(x), since you don't want that, don't call
    list.__str__
    [color=blue]
    >
    > Note: The problem goes away if "list.__str__(a )" is replaced with
    > "list.__repr__( self)".
    > """[/color]

    That's right. You *cannot* call list.__str__ because it contradicts
    design of class A

    Comment

    Working...