Just change the order:
print "A {size_name} sized {medium} is {width2} by {height2}".format(height2=height*2,width2=width*2,**locals())
Star arguments always come after normal ones.
To make this answer less trivial, this is what I have in my standard repertoire:
import string
def f(s, *args, **kwargs):
"""Kinda "variable interpolation". NB: cpython-specific!"""
frame = sys._getframe(1)
d = {}
d.update(frame.f_globals)
d.update(frame.f_locals)
d.update(kwargs)
return string.Formatter().vformat(s, args, d)
It can be applied to your example like this:
print f("A {size_name} sized {medium} is {0} by {1}", width*2, height*2)
local (and global) variables are passed in automatically, expressions use numeric placeholders.