Steve D'Aprano wrote: > 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 > > > > >
Well take a look at this: ########################################### #!/usr/bin/python class Foo(int): def __init__(self, value): self.value = value def __str__(self): print '__str__' return str(self.value) def __int__(self): print '__int__' return self.value + 1 #'%s' % Foo(10) # %s is mapped to __str__ '%d' % Foo(20) ########################################### here, '__str__' prints because when you do: '%s' % x the __str__ method is invoked. So internally %s invokes __str__ independent of print. However the next line doesn't trigger any similar invocation with __int__ or__str__? (but int(Foo(10)) would invoked __int__) Is there a way to trigger special methods using %d etc OR is this restricted to %s and why? -- https://mail.python.org/mailman/listinfo/python-list