I think format
and str.format
do different things. Even though you could use str.format
for both, it makes sense to have separate versions.
The top level format
function is part of the new "formatting protocol" that all objects support. It simply calls the __format__
method of the object it is passed, and returns a string. This is a low-level task, and Python's style is to usually have builtin functions for those. Paulo Scardine's answer explains some of the rationale for this, but I don't think it really addresses the differences between what format
and str.format
do.
The str.format
method is a bit more high-level, and also a bit more complex. It can not only format multiple objects into a single result, but it can also reorder, repeat, index, and do various other transformations on the objects. Don't just think of "{}".format(obj)
. str.format
is really designed for more about complicated tasks, like these:
"{1} {0} {1!r}".format(obj0, obj1) # reorders, repeats, and and calls repr on obj1
"{0.value:.{0.precision}f}".format(obj) # uses attrs of obj for value and format spec
"{obj[name]}".format(obj=my_dict) # takes argument by keyword, and does an item lookup
For the low-level formatting of each item, str.format
relies on the same machinery of the format protocol, so it can focus its own efforts on the higher level stuff. I doubt it actually calls the builtin format
, rather than its arguments' __format__
methods, but that's an implementation detail.
While ("{:"+format_spec+"}").format(obj)
is guaranteed to give the same results as format(obj, format_spec)
, I suspect the latter will be a bit faster, since it doesn't need to parse the format string to check for any of the complicated stuff. However the overhead may be lost in the noise in a real program.
When it comes to usage (including examples on Stack Overflow), you may see more str.format
use simply because some programmers do not know about format
, which is both new and fairly obscure. In contrast, it's hard to avoid str.format
(unless you have decided to stick with the %
operator for all of your formatting). So, the ease (for you and your fellow programmers) of understanding a str.format
call may outweigh any performance considerations.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…