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

2012-11-04 Thread Roy Smith
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.
-- 
http://mail.python.org/mailman/listinfo/python-list


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

2012-11-04 Thread Aahz
In article roy-30ba92.08410804112...@news.panix.com,
Roy Smith  r...@panix.com 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.

You apparently need more coffee when programming after waking up!  (Or
even worse, staying up all night.)
-- 
Aahz (a...@pythoncraft.com)   * http://www.pythoncraft.com/

Normal is what cuts off your sixth finger and your tail...  --Siobhan
-- 
http://mail.python.org/mailman/listinfo/python-list


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

2012-11-04 Thread Terry Reedy

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