On 8/3/07, Talin <[EMAIL PROTECTED]> 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 _______________________________________________ Python-3000 mailing list Python-3000@python.org http://mail.python.org/mailman/listinfo/python-3000 Unsubscribe: http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com