[Python-3000] More PEP 3101 changes incoming
Adam Olsen
rhamph at gmail.com
Sat Aug 4 07:03:14 CEST 2007
On 8/3/07, Talin <talin at acm.org> wrote:
> Ron Adam wrote:
> > After a fair amount of experimenting today, I think I've found a nice
> > middle ground that meets some of what both you and Guido are looking
> > for. (And a bit my own preference too.)
>
> First off, thank you very much for taking the time to think about this
> in such detail. There are a lot of good ideas here.
>
> What's missing, however, is a description of how all of this interacts
> with the __format__ hook. The problem we are facing right now is
> sometimes we want to override the __format__ hook and sometimes we
> don't. Right now, the model that we want seems to be:
>
> 1) High precedence type coercion, i.e. 'r', which bypasses __format__.
> 2) Check for __format__, and let it interpret the format specifier.
> 3) Regular type coercion, i.e. 'd', 'f' and so on.
> 4) Regular formatting based on type.
Why not let __format__ return NotImplemented as meaning "use a
fallback". E.g., 'd' would fall back to obj.__index__, 'r' to
repr(obj), etc. You'd then have code like this:
class float:
def __format__(self, type, ...):
if type == 'f':
return formatted float
else:
return NotImplemented
class MyFloat:
def __format__(self, type, ...):
if type == 'D':
return custom format
else:
return float(self).__format__(type, ...)
class Decimal:
def __format__(self, type, ...):
if type == 'f':
return formatted similar to float
else:
return NotImplemented
def handle_format(obj, type, ...):
if hasattr(obj, '__format__'):
s = obj.__format__(type, ...)
else:
s = NotImplemented
if s is NotImplemented:
if type == 'f':
s = float(obj).__format__(type, ...)
elif type == 'd':
s = operator.index(obj).__format__(type, ...)
elif type == 'r':
s = repr(obj)
elif type == 's':
s = str(obj)
else:
raise ValueError("Unsupported format type")
return s
--
Adam Olsen, aka Rhamphoryncus
More information about the Python-3000
mailing list