インライン変数を使用して複数行のPython文字列を作成するにはどうすればよいですか?


94

複数行のPython文字列内で変数を使用するクリーンな方法を探しています。次のようにしたいとします。

string1 = go
string2 = now
string3 = great

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

$Python構文の変数を示すために、Perlに似たものがあるかどうかを確認しようとしています。

そうでない場合-変数を含む複数行の文字列を作成する最もクリーンな方法は何ですか?

回答:


155

一般的な方法はformat()関数です:

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

それは複数行のフォーマット文字列でうまく動作します:

>>> 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.

変数を含む辞書を渡すこともできます。

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

あなたが尋ねたもの(構文に関して)に最も近いものは、テンプレート文字列です。例えば:

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

ただし、このformat()関数はすぐに利用でき、インポート行を必要としないため、より一般的です。


2
問題の辞書として、vars()または使用できますlocals()
Ismail Badawi 2012

2
@isbadawi Explicitは暗黙よりも優れています。必要な変数のみを渡す方がよいでしょう。どちらが必要かわからない場合は、文字列はユーザ​​ーによって提供されるため、「変数」はdictとにかくアイテムでなければなりません。
agf

2番目のソリューションは、最もクリーンなIMOです。辞書と、複数行文字列内の辞書からの明確な変数名。この方法を使用します。ありがとう。以下にもたくさんの素晴らしい答えがありますが、これは完璧でした。
進化

@SimeonVisser、 "string" .format(...)は、レガシーpythonバージョン(例2.4)では無効です
Oz123

中括弧を使用する場合は、のようにエスケープする必要があります{{this}}
ジョニー

52

:Pythonで文字列のフォーマットを行うための推奨される方法format()、承認された回答で概説されているように使用することです。この回答は、サポートされているCスタイルの構文の例として保存しています。

# 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)

いくつかの読書:


2
OPは位置パラメータではなく名前付きパラメータを必要とするため、これは実際には同じではありません。
Ismail Badawi

1
これは依然として優れたソリューションであり、複数ラインの補間の場合はより直接的です。何もインポートする必要はなく、通常のPython補間を使用します。
14

4
" おそらくグーグルの少しでこれに答えることができたでしょう " グーグルの後でこの投稿が見つからなかったことを
暗示してい

30

Python 3.6のf文字列は複数行または長い単一行文字列内の変数に使用できます。を使用して手動で改行文字を指定できます\n

複数行の文字列内の変数

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)

私はそこに行くだろう
、私は今行く
素晴らしいです

長い単一行文字列の変数

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

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

print(singleline_string)

そこに行きます。もう行きます。すごい。


または、三重引用符で複数行のf文字列を作成することもできます。

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

これにより、ソースコードがきれいに表示され、Python3.6より前のバージョンでは、これを行うだけで同じ効果を得ることができます(括弧の追加セット+と連結に使用):stackoverflow.com/a/54564926/4561887
Gabriel Staples

三重引用符が非常に好まれます。最初にそのフォームを提示する必要があります。
jpmc26

@ jpmc26 PEP 8のコードインデントに関するガイドラインに基づいて、最初に括弧スタイルを提示しました。なぜ三重引用符が好まれるのでしょうか?
Stevoisiak

10

これはあなたが望むものです:

>>> 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

三重引用符"""は改行を保持することに注意してください。これは、前後に余分な改行があることを意味しますmystring
Stevoisiak

あなたは使用することができ.strip().rstrip()または.lstrip()改行を作成しないように、またはトリプル引用符の内側のバックラッシュをUE。mystring = "" "\ ABC \" ""
Havok

6

辞書をに渡すことができますformat()。各キー名は、関連付けられた各値の変数になります。

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

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

print(multiline_string)


また、リストをに渡すこともできますformat()。この場合、各値のインデックス番号が変数として使用されます。

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

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

print(multiline_string)


上記の両方のソリューションは同じを出力します:

私はそこに行くよ
、私は今行く
素晴らしいです


0

オブジェクトを変数として渡すソリューションを探しているpython-graphqlクライアントから誰かがここに来た場合、ここで私が使用したものです:

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

 query = gql(query)

私のようにすべての中括弧をエスケープするようにしてください: "{{"、 "}}"


0

f-stringは、「フォーマットされた文字列リテラル」とも呼ばfれ、先頭にがある文字列リテラルです。そして、それらの値で置き換えられる式を含む中括弧。

f-stringは実行時に評価されます。

したがって、コードは次のように書き直すことができます。

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

そして、これは次のように評価されます:

I will go there
I will go now
great

詳細については、こちらをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.