Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #32739

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

From Terry Reedy <tjreedy@udel.edu>
Subject Re: __unicode__() works, unicode() blows up. (Never mind!)
Date 2012-11-04 13:10 -0500
References <roy-90D9A2.08321804112012@news.panix.com> <roy-30BA92.08410804112012@news.panix.com>
Newsgroups comp.lang.python
Message-ID <mailman.3261.1352052676.27098.python-list@python.org> (permalink)

Show all headers | View raw


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

Back to comp.lang.python | Previous | NextPrevious in thread | Find similar | Unroll thread


Thread

__unicode__() works, unicode() blows up. Roy Smith <roy@panix.com> - 2012-11-04 08:32 -0500
  Re: __unicode__() works, unicode() blows up. (Never mind!) Roy Smith <roy@panix.com> - 2012-11-04 08:41 -0500
    Re: __unicode__() works, unicode() blows up. (Never mind!) aahz@pythoncraft.com (Aahz) - 2012-11-04 09:13 -0800
    Re: __unicode__() works, unicode() blows up. (Never mind!) Terry Reedy <tjreedy@udel.edu> - 2012-11-04 13:10 -0500

csiph-web