On Wed, Nov 16, 2011 at 4:04 PM, Steven D'Aprano <st...@pearwood.info>wrote:
> Wayne Werner wrote: > >> <snip> 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. Ah, very cool. Just because I was interested, I did the same thing, only using (x,) and there was only one difference (line? 6): >>> dis.dis(compile('"%s" % (x, )', '', 'single')) 1 0 LOAD_CONST 0 ('%s') 3 LOAD_NAME 0 (x) 6 BUILD_TUPLE 1 9 BINARY_MODULO 10 PRINT_EXPR 11 LOAD_CONST 1 (None) 14 RETURN_VALUE <PSA tune> The more you know! Thanks, -Wayne
_______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor