On Sat, 10 Dec 2016 06:06 pm, Veek M wrote: > When we do: > > print '%s %d' % ('hello', 10) > > what special method is being invoked internally within the string- > format-specifier?
%d requires the argument to be an int, or able to be converted to int using the __int__ special method. py> class X(object): ... def __int__(self): ... return 42 ... py> "%d" % X() '42' > format() invokes format__ > print invokes __str__ print actually invokes __str__ or __repr__, whichever is available. > I'm basically trying to make sense of: > > raise TypeError('urkle urkle %s' % list(dictionary)) > <=> raise TypeError('urkle urkle %s' % [ key1, val1, key2, val2 ] The raise TypeError part of the code is irrelevant to your question. You should always simplify your code to only the part that is relevant. raise TypeError(some_string) behaves the same regardless of how some_string is made. > So, the % operator reads the format specifier and notices %s and > therefore calls __str__ in the list class to figure out how to represent > [ key1, val1, key2, val2 ]. > > However what if I use %d? How do the other format specs work? The format specifiers are similar to these: %s => str(obj), which ends up calling __str__ or __repr__ %r => repr(obj), which ends up calling __repr__ or __str__ %c => chr(obj), or obj must be a string of length 1 %d %i %u => int(obj), which ends up calling __int__ %x %X => int(obj), then convert to hexadecimal %o => int(obj), then convert to octal %e %E %f %g %G => float(obj), which ends up calling __float__ %% => a literal % sign -- Steve “Cheer up,” they said, “things could be worse.” So I cheered up, and sure enough, things got worse. -- https://mail.python.org/mailman/listinfo/python-list