On 11/4/2012 8:41 AM, Roy Smith wrote:
In article <roy-90d9a2.08321804112...@news.panix.com>,
  Roy Smith <r...@panix.com> wrote:

print u.__unicode__()
None

print unicode(u)
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
TypeError: coercing to Unicode: need string or buffer, NoneType found

What's going on here?  I thought
(http://docs.python.org/2/library/functions.html#unicode) the latter two
calls should be identical, but obviously they're not.

Why is it, that no matter how long you stare at a problem, the answer
comes to you moments after you hit the Post button? :-)

The problem is that __unicode__() is supposed to return a Unicode
object, and unicode() enforces that.  The fix is to change:

     def __unicode__(self):
         return self.username

to be:

     def __unicode__(self):
         return unicode(self.username)

This never got noticed before because normally, self.username already is
a unicode string, so it just works.

The same principle applies to some of the other special methods that sit behind builtin functions.

>>> class C:
        def __len__(self): return '42'  # whoops
        
>>> len(C())
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    len(C())
TypeError: 'str' object cannot be interpreted as an integer

>>> class C:
        def __len__(self): return -42  # whoops again
        
>>> len(C())
Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    len(C())
ValueError: __len__() should return >= 0


--
Terry Jan Reedy

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to