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