anuraguni...@yahoo.com wrote:
class A(object):
    def __unicode__(self):
        return u"©au"
    def __repr__(self):
        return unicode(self).encode("utf-8")
    __str__ = __repr__
a = A()
u1 = unicode(a)
u2 = unicode([a])

now I am not using print so that doesn't matter stdout can print
unicode or not
my naive question is line u2 = unicode([a]) throws
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position
1: ordinal not in range(128)

shouldn't list class call unicode on its elements?
> I was expecting that so instead do i had to do this
> u3 = "["+u",".join(map(unicode,[a]))+"]"

Why would you expect that?  str([a]) doesn't call str on its elements.
Using our simple expedient:
    class B(object):
        def __unicode__(self):
            return u'unicode'
        def __repr__(self):
            return 'repr'
        def __str__(self):
            return 'str'
    >>> unicode(B())
    u'unicode'
    >>> unicode([B()])
    u'[repr]'
    >>> str(B())
    'str'
    >>> str([B()])
    '[repr]'

Now if you ask _why_ call repr on its elements,
the answer is, "so that the following is not deceptive:

    >>> repr(["a, b", "c"])
    "['a, b', 'c']"
which does not look like a 3-element list.

--Scott David Daniels
scott.dani...@acm.org
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to