如何使用内联变量创建多行 Python 字符串?

我正在寻找一种在多行 Python 字符串中使用变量的简洁方法。假设我想做以下事情:

string1 = go
string2 = now
string3 = great


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

我想看看在 Perl 中是否有类似于 $的东西来指示 Python 语法中的变量。

如果没有,创建带有变量的多行字符串的最干净的方法是什么?

192309 次浏览

注意 : 在 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)

一些阅读材料:

通常的方法是 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.

还可以传递带有变量的 dictionary:

>>> 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()函数是更常见的,因为它是随时可用的,它不需要一个导入行。

这就是你想要的:

>>> 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 3.6的 f-string,也可以对较长的单行字符串使用 Python 3.6的 f-string。可以使用 \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-string。

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

如果有任何人从 python-grapql 客户端来这里寻找一个解决方案,以传递一个对象作为变量,这里是我使用的:

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


query = gql(query)

确保像我一样省略所有大括号: “\{\{”,“}}”

F-string ,也称为“格式化的字符串文字”,是字符串文字,在开头有一个 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

你可以了解更多关于它 给你