Does Python do variable interpolation similar to "string #{var}" in Ruby?

Question:

In Python, it is tedious to write:

print "foo is" + bar + '.'

Can I do something like this in Python?

print "foo is #{bar}."

Asked By: mko

||

Answers:

Yes, absolutely. Python, in my opinion, has great support for string formatting, replacements and operators.

This might be helpful:
http://docs.python.org/library/stdtypes.html#string-formatting-operations

Answered By: Edmon

String formatting

>>> bar = 1
>>> print "foo is {}.".format(bar)
foo is 1.
Answered By: Josiah

Python 3.6+ does have variable interpolation – prepend an f to your string:

f"foo is {bar}"

For versions of Python below this (Python 2 – 3.5) you can use str.format to pass in variables:

# Rather than this:
print("foo is #{bar}")

# You would do this:
print("foo is {}".format(bar))

# Or this:
print("foo is {bar}".format(bar=bar))

# Or this:
print("foo is %s" % (bar, ))

# Or even this:
print("foo is %(bar)s" % {"bar": bar})
Answered By: Sean Vieira

I have learned the following technique from Python Essential Reference:

>>> bar = "baz"
>>> print "foo is {bar}.".format(**vars())
foo is baz.

This is quite useful when we want to refer to many variables in the formatting string:

  • We don’t have to repeat all variables in the argument list again: compare it to the explicit keyword argument-based approaches (such as "{x}{y}".format(x=x, y=y) and "%(x)%(y)" % {"x": x, "y": y}).
  • We don’t have to check one by one if the order of variables in the argument list is consistent with their order in the formatting string: compare it to the positional argument-based approaches (such as "{}{}".format(x, y), "{0}{1}".format(x, y) and "%s%s" % (x, y)).
Answered By: dkim

I prefer this approach because you don’t have to repeat yourself by referencing the variable twice:

alpha = 123
print 'The answer is {alpha}'.format(**locals())
Answered By: Chris Johnson

There is a big difference between this in Ruby:

print "foo is #{bar}."

And these in Python:

print "foo is {bar}".format(bar=bar)

In the Ruby example, bar is evaluated
In the Python example, bar is just a key to the dictionary

In the case that you are just using variables the behave more or less the same, but in general, converting Ruby to Python isn’t quite so simple

Answered By: John La Rooy

Python 3.6 has introduced f-strings:

print(f"foo is {bar}.")

Old answer:

Since version 3.2 Python has str.format_map which together with locals() or globals() allows you to do fast:

Python 3.3.2+ (default, Feb 28 2014, 00:52:16) 
>>> bar = "something"
>>> print("foo is {bar}".format_map(locals()))
foo is something
>>> 
Answered By: warvariuc

Python 3.6 will have has literal string interpolation using f-strings:

print(f"foo is {bar}.")
Answered By: AXO

Almost every other answer didn’t work for me. Probably it’s because I’m on Python3.5. The only thing which worked is:

 print("Foobar is %s%s" %('Foo','bar',))
Answered By: valk