Wayne Werner wrote:
On Wed, Nov 16, 2011 at 10:09 AM, Steven D'Aprano <st...@pearwood.info>wrote:

Wayne Werner wrote:
<snip>

In old style formatting, you use a string with format specifiers (%s, %d,
etc.) followed by a tuple of arguments. Here, the lengths have to match
exactly - if you have one specifier then you must have a 1-element tuple.

That's actually wrong. If you have one specifier, you must have one object
of any sort *except* a tuple.


I think you misunderstood - I said a 1-element tuple - e.g. (3,)

Actually, I didn't misunderstand... I just worded my reply badly. Sorry for the confusion.

What I should have said was, you *can* use a 1-element tuple, but you don't *need* to use a 1-element tuple UNLESS that element is itself a tuple. For any other object, just use the object itself. There's no need to wrap it in a tuple first.



As above, that's a two-element tuple. It was explained to me once that in
this case:

"%s" % 42

That since python expects to see a single-element tuple it treats it as or
converts 42 to a single element tuple.

"Treats as" may be true; "converts to" not so much. What it actually does is this:

py> import dis
py> dis.dis(compile('"%s" % x', '', 'single'))
  1           0 LOAD_CONST               0 ('%s')
              3 LOAD_NAME                0 (x)
              6 BINARY_MODULO
              7 PRINT_EXPR
              8 LOAD_CONST               1 (None)
             11 RETURN_VALUE


Notice that the call to BINARY_MODULO (the % operator) takes two arguments, the string "%s" and the object x, whatever it happens to be. Python can't convert x to a tuple at this point, because it doesn't know what x is, and it may not know how many format specifiers are in the string either.

Once the string and the object hit BINARY_MODULO, all bets are off. It will do whatever it likes, because that's purely internal implementation.



--
Steven

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to