[Python-Dev] Default formatting
Steve Dower
steve.dower at python.org
Thu Oct 27 12:59:39 EDT 2016
On 27Oct2016 0251, Serhiy Storchaka wrote:
> On 27.10.16 02:44, Eric V. Smith wrote:
>> But on the other hand, the existing behavior is well specified and has
>> been around since object.__format__ was added. I'm not sure it needs
>> changing. What's the harm in leaving it?
>
> More complicated code. And maybe this behavior is less intuitive. It
> contradicts the documentation.
>
> From the documentation of the format() builtin [1]:
>
> "The default format_spec is an empty string which usually gives the same
> effect as calling str(value)."
>
> From the description of the format specification mini-language [2]:
>
> "A general convention is that an empty format string ("") produces the
> same result as if you had called str() on the value."
>
> [1] https://docs.python.org/3/library/functions.html#format
> [2] https://docs.python.org/3/library/stdtypes.html#str.format
>
The only point where this bothers me is that alignments don't work:
>>> class F: pass
...
>>> '{}'.format(F())
'<__main__.F object at 0x000002148AFE6B70>'
>>> '{:100}'.format(F())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: non-empty format string passed to object.__format__
>>> '{:<100}'.format(F())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: non-empty format string passed to object.__format__
You need to explicitly include '!s' to be able to align it, which then
means overriding __format__ in that class later won't have any effect.
>>> '{!s:<100}'.format(F())
'<__main__.F object at 0x000002148AFEE240>
'
Having the default __format__ behave like this makes me happiest:
... def __format__(self, fmt):
... return format(str(self), fmt)
My 2c. YMMV. etc.
Cheers,
Steve
More information about the Python-Dev
mailing list