__unicode__() works, unicode() blows up. (Never mind!)

Terry Reedy tjreedy at udel.edu
Sun Nov 4 19:10:55 CET 2012


On 11/4/2012 8:41 AM, Roy Smith wrote:
> In article <roy-90D9A2.08321804112012 at news.panix.com>,
>   Roy Smith <roy at 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



More information about the Python-list mailing list