web-dev-qa-db-ja.com

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

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

string1 = go
string2 = now
string3 = great

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

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

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

73
evolution

一般的な方法は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()関数はより一般的であり、すぐに使用でき、インポート行を必要としないため、追加する必要があります。

116
Simeon Visser

NOTE: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)

読書:

45
David Cain

Python 3.6のf-stringsmulti-line または長い単一行の文字列内の変数に使用できます。 \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}."""
19
Stevoisiak

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

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

辞書は 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)


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

私はそこに行きます
もう行くね
すばらしいです

6
jesterjunk