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


94

我正在寻找一种在多行Python字符串中使用变量的干净方法。假设我想执行以下操作:

string1 = go
string2 = now
string3 = great

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

我正在寻找是否有与$Perl中类似的东西来指示Python语法中的变量。

如果不是-用变量创建多行字符串的最干净方法是什么?

Answers:


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

2
@isbadawi显式优于隐式。最好只传递所需的变量。如果您不知道需要哪个,因为该字符串是由用户提供的,dict无论如何,“变量”应该是项目。
2012年

第二种解决方案是最干净的IMO。字典以及多行字符串中字典中的明确变量名。我将使用这种方法。谢谢。下面也有很多很棒的答案,但这是完美的。
演变

@SimeonVisser,“ string” .format(...)在旧版python版本(例如2.4)上无效
Oz123 2012年

如果使用花括号,则需要像一样将其转义{{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插值。
unflores 2014年

4
您可能会用一点Google搜索来回答这个问题 ”,暗示我们在Google搜索后没有找到此帖子……
Stevoisiak

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(),或使用反斜线,以避免创建换行符。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字符串,也称为“格式化字符串文字”,是具有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

您可以在此处了解更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.