Why does str not have a __radd__ method?

wxjmfauth at gmail.com wxjmfauth at gmail.com
Thu Aug 14 02:24:36 EDT 2014


Le mercredi 13 août 2014 20:36:55 UTC+2, Jason Swails a écrit :
> On Wed, Aug 13, 2014 at 1:55 PM, Steven D'Aprano <steve+comp.... at pearwood.info> wrote:
> 
> 
> Ethan Furman wrote:
> 
> 
> 
> > On 08/13/2014 09:00 AM, Steven D'Aprano wrote:
> 
> >>
> 
> 
> >> What is the rationale for str not having __radd__ method?
> 
> >
> 
> 
> > At a guess I would say because string only knows how to add itself to
> 
> > other strings, so __add__ is sufficient.
> 
> 
> 
> # Python 2.7
> 
> py> "Hello" + u"World"
> 
> u'HelloWorld'
> 
> py> unicode.__radd__
> 
> 
> Traceback (most recent call last):
> 
>   File "<stdin>", line 1, in <module>
> 
> AttributeError: type object 'unicode' has no attribute '__radd__'
> 
> 
> 
> This happens because the str.__add__ function calls string_concat under the hood (see Objects/stringobject.c) -- there's a unicode check on the other operand that results in the result of PyUnicode_Concat being returned instead of the concatenated str type.  This doesn't require that unicode define __radd__.
> 
> 
> 
> When the left-hand operand is Unicode, PyUnicode_Concat is called directly (which is why the exception message is different for u'this' + 1 and 'this' + 1):
> 
> 
> 
> 
> >>> 'this' + 1
> Traceback (most recent call last):
> 
>   File "<stdin>", line 1, in <module>
> TypeError: cannot concatenate 'str' and 'int' objects
> 
> >>> u'this' + 1
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> 
> TypeError: coercing to Unicode: need string or buffer, int found
> 
> 
> 
> 
> All the best,
> Jason

--------

This is more funny.

>>> print u'a' + 'a'
aa
>>> print 'a' + u'a'
aa
>>> print u'a' + 'é'

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    print u'a' + 'é'
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)
>>> 

Python? The single language, which tried (and still tries
to make the ascii world compatible with the unicode
world.

In a somwhow symmetrical way, but a little bit
differently, the situation in Python 3 is even worse.

jmf

PS See my comment about the Euro sign in a previous
thread.






More information about the Python-list mailing list