224

I am looking for a clean way to use variables within a multiline Python string. Say I wanted to do the following:

string1 = go
string2 = now
string3 = great

"""
I will $string1 there
I will go $string2
$string3
"""

I'm looking to see if there is something similar to $ in Perl to indicate a variable in the Python syntax.

If not - what is the cleanest way to create a multiline string with variables?

10 Answers 10

282

The common way is the format() function:

>>> s = "This is an {example} with {vars}".format(vars="variables", example="example")
>>> s
'This is an example with variables'

It works fine with a multi-line format string:

>>> s = '''\
... This is a {length} example.
... Here is a {ordinal} line.\
... '''.format(length='multi-line', ordinal='second')
>>> print(s)
This is a multi-line example.
Here is a second line.

You can also pass a dictionary with variables:

>>> d = { 'vars': "variables", 'example': "example" }
>>> s = "This is an {example} with {vars}"
>>> s.format(**d)
'This is an example with variables'

The closest thing to what you asked (in terms of syntax) are template strings. For example:

>>> from string import Template
>>> t = Template("This is an $example with $vars")
>>> t.substitute({ 'example': "example", 'vars': "variables"})
'This is an example with variables'

I should add though that the format() function is more common because it's readily available and it does not require an import line.

Sign up to request clarification or add additional context in comments.

7 Comments

Could use vars() or locals() as the dictionary in question
@isbadawi Explicit is better than implicit. Better to pass in only the variables you need. If you don't know which you need, because the string is supplied by the user, the "variables" should be items in a dict anyway.
The second solution is cleanest IMO. The dictionary along with clear variable name from the dictionary within the multiline sting. I will be using this method. Thanks. Loads of great answers below too but this was perfect.
@SimeonVisser, "string".format(...) is not valid on legacy python versions (e.g. 2.4)
If using curly braces, they need to be escaped like {{this}}.
|
96

You can use Python 3.6's f-strings for variables inside multi-line or lengthy single-line strings. You can manually specify newline characters using \n.

Variables in a multi-line string

string1 = "go"
string2 = "now"
string3 = "great"

multiline_string = (
    f"I will {string1} there\n"
    f"I will go {string2}.\n"
    f"{string3}."
)

print(multiline_string)

I will go there
I will go now
great

Variables in a lengthy single-line string

string1 = "go"
string2 = "now"
string3 = "great"

singleline_string = (
    f"I will {string1} there. "
    f"I will go {string2}. "
    f"{string3}."
)

print(singleline_string)

I will go there. I will go now. great.


Alternatively, you can also create a multiline f-string with triple quotes where literal newlines are considered part of the string. However, any spaces at the start of the line would also be part of the string, so it can mess with code indentation.

multiline_string = f"""I will {string1} there.
I will go {string2}.
{string3}."""

7 Comments

This keeps your source code looking pretty, and in pre-Python3.6 you can get the same effect just by doing this (extra set of parenthesis and using + to concatenate): stackoverflow.com/a/54564926/4561887
Triple quoting is vastly preferred. You should present that form first.
@jpmc26 I presented parenthesis-style first based on PEP 8's guidelines for code indentation. Why would triple quoting be preferred?
I always forget about the f prefix to enable formatting inline. But I like this approach for multi-inline formatting.
@jpmc26, One thing I dislike about triple quoting is that it requires you to violate your indentation.
|
74

NOTE: The recommended way to do string formatting in Python is to use format(), as outlined in the accepted answer. I'm preserving this answer as an example of the C-style syntax that's also supported.

# NOTE: format() is a better choice!
string1 = "go"
string2 = "now"
string3 = "great"

s = """
I will %s there
I will go %s
%s
""" % (string1, string2, string3)

print(s)

Some reading:

4 Comments

This isn't really the same because the OP wants named parameters, not positional ones.
It's still a good solution, and for a multi-line interpolation it's more direct. You don't have to import anything and it uses regular python interpolation.
"You probably could have answered this one with a little bit of Googling" Implying that we didn't find this post after Googling...
+1 because your solution is the simplest method of interpolating variables into a string which contains many curly braces unrelated to the variables being interpolated!
34

f-strings, also called “formatted string literals,” are string literals that have an f at the beginning; and curly braces containing expressions that will be replaced with their values.

f-strings are evaluated at runtime.

So your code can be re-written as:

string1="go"
string2="now"
string3="great"
print(f"""
I will {string1} there
I will go {string2}
{string3}
""")

And this will evaluate to:

I will go there
I will go now
great

You can learn more about it here.

Comments

15

If anyone came here from python-graphql client looking for a solution to pass an object as variable here's what I used:

query = """
{{
  pairs(block: {block} first: 200, orderBy: trackedReserveETH, orderDirection: desc) {{
    id
    txCount
    reserveUSD
    trackedReserveETH
    volumeUSD
  }}
}}
""".format(block=''.join(['{number: ', str(block), '}']))

 query = gql(query)

Make sure to escape all curly braces like I did: "{{", "}}"

1 Comment

Useful example for GraphQL highlighting how to escape braces. For simpler interpolation, query = f""" {{ pairs( block: {block_value} ...) {{ ... }} }} """ also works.
14

This is what you want:

>>> string1 = "go"
>>> string2 = "now"
>>> string3 = "great"
>>> mystring = """
... I will {string1} there
... I will go {string2}
... {string3}
... """
>>> locals()
{'__builtins__': <module '__builtin__' (built-in)>, 'string3': 'great', '__package__': None, 'mystring': "\nI will {string1} there\nI will go {string2}\n{string3}\n", '__name__': '__main__', 'string2': 'now', '__doc__': None, 'string1': 'go'}
>>> print(mystring.format(**locals()))

I will go there
I will go now
great

2 Comments

Note that triple quotes """ preserves newlines, which means there is an extra newline before and after mystring
You can use .strip(), .rstrip() or .lstrip(), or ue a backlash inside the triple quotes to avoid creating a newline. mystring = """\ ABC\ """
8

A dictionary can be passed to format(), each key name will become a variable for each associated value.

dict = {'string1': 'go',
        'string2': 'now',
        'string3': 'great'}

multiline_string = '''I'm will {string1} there
I will go {string2}
{string3}'''.format(**dict)

print(multiline_string)


Also a list can be passed to format(), the index number of each value will be used as variables in this case.

list = ['go',
        'now',
        'great']

multiline_string = '''I'm will {0} there
I will go {1}
{2}'''.format(*list)

print(multiline_string)


Both solutions above will output the same:

I'm will go there
I will go now
great

Comments

5

Simplest way is to use f-string multiline.

string1 = "go"
string2 = "now"
string3 = "great"

s = f"""
I will {string1} there
I will go {string2}
{string3}
"""

print(s)

This will return.

I will go there
I will go now
great

Hope this helps.

Comments

2
print (f" \
      What you want to write {var_one} \n \
      What you want to write {var_two} \n \
      What you want to write {var_three} \n \
      Et cetera {var_four}")

This was what was working for me. Maybe it helps someone, cheers

Comments

0

Here is an example to break a string into multiple lines in a @dataclass for use with QT style sheets. The end of each line needs to be terminate in double quote followed by a slash, except for the last line. Indentation of the start of each line is also critical.

@dataclass

class button_a:

   i: str = "QPushButton:hover {background: qradialgradient(cx:0, cy:0, radius:1,fx:0.5,fy:0.5,stop:0 white, stop:1 green);"\

   "color:qradialgradient(cx:0, cy:0, radius:1,fx:0.5,fy:0.5,stop:0 yellow, stop:1 brown);"\

   "border-color: purple;}"

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.