複数行のPython文字列内で変数を使用するためのクリーンな方法を探しています。次のことをしたいとします。
string1 = go
string2 = now
string3 = great
"""
I will $string1 there
I will go $string2
$string3
"""
$
Python構文で変数を示すためにPerlに似たものがあるかどうかを調べています。
そうでない場合-変数を使用して複数行の文字列を作成する最もクリーンな方法は何ですか?
一般的な方法は次の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()
関数はすぐに利用でき、インポート行を必要としないため、より一般的です。
注: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)
いくつかの読書:
複数行または長い単一行の文字列内の変数には、Python3.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}."""
「フォーマットされた文字列リテラル」とも呼ばれるf文字列f
は、先頭にが付いた文字列リテラルです。値に置き換えられる式を含む中括弧。
f文字列は実行時に評価されます。
したがって、コードは次のように書き直すことができます。
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
あなたはここでそれについてもっと学ぶことができます。
これはあなたが望むものです:
>>> 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
辞書をに渡すことができます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)
上記の両方のソリューションは同じものを出力します。
私はそこに行きます
私は今
素晴らしい行きます
オブジェクトを変数として渡すための解決策を探している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)
私がしたように、すべて中括弧をエスケープするようにしてください: "{{"、 "}}"