values in tuple and ignore the nontupled optionthe expression is essentially the same as the method call here moreoverthe method incurs price in inflated code size to achieve its constrained usage mode given the expression' wide use over python' historythis issue may be more theoretical than practicaland may not justify porting existing code to new tool that is so similar to that it seeks to subsume functions versus expressionsa minor convenience the final rationale for the format method--it' function that can appear where an expression cannot--requires more information about functions than we yet have at this point in the bookso we won' dwell on it here suffice it to say that both the str format method and the format built-in function can be passed to other functionsstored in other objectsand so on an expression like cannot directlybut this may be narrow-sighted--it' trivial to wrap any expression in one-line def or partial-line lambda once to turn it into function with the same properties (though finding reason to do so may be more challenging)def myformat(fmtargs)return fmt args see part iv myformat('% % '( )str format('{{}' call your function object versus calling the built-in otherfunction(myformatyour function is an object too in the endthis may not be an either/or choice while the expression still seems more pervasive in python codeboth formatting expressions and methods are available for use in python todayand most programmers will benefit from being familiar with both techniques for years to come that may double the work of newcomers to the language in this departmentbut in this bazaar of ideas we call the open source software worldthere always seems to be room for more plus one moretechnically speakingthere are (not formatting tools built into pythonif we include the obscure string module' template tool mentioned earlier now that we've seen the other twoi can show you how it compares the expression and method can be used as templating tools tooreferring to substitution values by name via dictionary keys or keyword arguments'%(num) %(title)sdict(num= title='strings'' strings see also the note about str format bug (or regressionin pythons and concerning generic empty substitution targets for object attributes that define no __format__ handler this impacted working example from this book' prior edition while it may be temporary regressionit does at the least underscore that this method is still bit of moving target--yet another reason to question the feature redundancy it implies string fundamentals