__unicode__() works, unicode() blows up.

2012-11-04 Thread Roy Smith
Environment:
  Python-2.7.3
  Ubuntu Precise
  mongoengine 0.6.20

I have a class which includes a __unicode__() method:

class User(mongoengine.Document):
def __unicode__(self):
return self.username

If I create an instance of this class by calling the constructor 
directly, self.username is None.  When I pass that to unicode(), it 
blows up.  However, calling __unicode__() directly, works as expected:

 u = User()
 print u.username
None

 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.
-- 
http://mail.python.org/mailman/listinfo/python-list


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.

2012-11-04 Thread Joshua Landau
On 4 November 2012 13:32, Roy Smith r...@panix.com wrote:

 Environment:
   Python-2.7.3
   Ubuntu Precise
   mongoengine 0.6.20

 I have a class which includes a __unicode__() method:

 class User(mongoengine.Document):
 def __unicode__(self):
 return self.username

 If I create an instance of this class by calling the constructor
 directly, self.username is None.  When I pass that to unicode(), it
 blows up.  However, calling __unicode__() directly, works as expected:

  u = User()
  print u.username
 None

  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.


 class Foo:
... def __unicode__(self): return Bar # NOT Unicode
...
 Foo().__unicode__()
'Bar'
 unicode(Foo())
u'Bar'

unicode(x) calls x.__unicode__() *and then* coerces the result to Unicode.

None cannot be coerced to Unicode.
-- 
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