String formatting named parameters?
I know it's a really simple question, but I have no idea how to google it.
how can I do
print '<a href="%s">%s</a>' % (my_url)
So that my_url
is used twice? I assume I have to "name" the %s
and then use a dict in the params, but I'm not sure of the proper syntax?
just FYI, I'm aware I can just use my_url
twice in the params, but that's not the point :)
print '<a href="%(url)s">%(url)s</a>' % {'url': my_url}
In Python 2.6+ and Python 3, you might choose to use the newer string formatting method.
print('<a href="{0}">{0}</a>'.format(my_url))
which saves you from repeating the argument, or
print('<a href="{url}">{url}</a>'.format(url=my_url))
if you want named parameters.
print('<a href="{}">{}</a>'.format(my_url, my_url))
which is strictly positional, and only comes with the caveat that format() arguments follow Python rules where unnamed args must come first, followed by named arguments, followed by *args (a sequence like list or tuple) and then *kwargs (a dict keyed with strings if you know what's good for you). The interpolation points are determined first by substituting the named values at their labels, and then positional from what's left. So, you can also do this...
print('<a href="{not_my_url}">{}</a>'.format(my_url, my_url, not_my_url=her_url))
But not this...
print('<a href="{not_my_url}">{}</a>'.format(my_url, not_my_url=her_url, my_url))
Solution in Python 3.6+
Python 3.6 introduces literal string formatting, so that you can format the named parameters without any repeating any of your named parameters outside the string:
print(f'<a href="{my_url:s}">{my_url:s}</a>')
This will evaluate my_url
, so if it's not defined you will get a NameError
. In fact, instead of my_url
, you can write an arbitrary Python expression, as long as it evaluates to a string (because of the :s
formatting code). If you want a string representation for the result of an expression that might not be a string, replace :s
by !s
, just like with regular, pre-literal string formatting.
For details on literal string formatting, see PEP 498, where it was first introduced.