New submission from Craig McQueen <pyt...@craig.mcqueen.id.au>:

I have just been trying to figure out how string interpolation works for "%s", 
when Unicode strings are involved. It seems it's a bit complicated, but the 
Python documentation doesn't really describe it. It just says %s "converts any 
Python object using str()".

Here is what I have found (I think), and it could be worth improving the 
documentation of this somehow.

Example 1:
    "%s" % test_object

>From what I can tell, in this case:
1. test_object.__str__() is called.
2. If test_object.__str__() returns a string object, then that is substituted.
3. If test_object.__str__() returns a Unicode object (for some reason), then 
test_object.__unicode__() is called, then _that_ is substituted instead. The 
output string is turned into Unicode. This behaviour is surprising.

[Note that the call to test_object.__str__() is not the same as 
str(test_object), because the former can return a Unicode object without 
causing an error, while the latter, if it gets a Unicode object, will then try 
to encode('ascii') to a string, possibly generating a UnicodeEncodeError 
exception.]


Example 2:
    u"%s" % test_object

In this case:
1. test_object.__unicode__() is called, if it exists, and the result is 
substituted. The output string is Unicode.
2. If test_object.__unicode__() doesn't exist, then test_object.__str__() is 
called instead, converted to Unicode, and substituted. The output string is 
Unicode.


Example 3:
    "%s %s" % (u'unicode', test_object)

In this case:
1. The first substitution causes the output string to be Unicode.
2. It seems that (1) causes the second substitution to follow the same rules as 
Example 2. This is a little surprising.

----------
assignee: d...@python
components: Documentation
messages: 109516
nosy: cmcqueen1975, d...@python
priority: normal
severity: normal
status: open
title: Improve docs for string interpolation "%s" re Unicode strings
versions: Python 2.7

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue9196>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to