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

Posted

技术标签:

【中文标题】如何使用内联变量创建多行 Python 字符串?【英文标题】:How do I create a multiline Python string with inline variables? 【发布时间】:2012-04-24 03:38:59 【问题描述】:

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

string1 = go
string2 = now
string3 = great

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

我正在寻找 Perl 中是否有类似于 $ 的内容来指示 Python 语法中的变量。

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

【问题讨论】:

【参考方案1】:

常用的方式是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'

最接近你所问的(就语法而言)是template strings。例如:

>>> 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() 函数更常见,因为它很容易获得并且不需要导入行。

【讨论】:

可以使用vars()locals() 作为相关字典 @isbadawi 显式优于隐式。最好只传入你需要的变量。如果你不知道你需要哪个,因为字符串是由用户提供的,那么“变量”应该是 dict 中的项目。 第二种解决方案是最干净的 IMO。字典以及多行字符串中字典中的明确变量名称。我将使用这种方法。谢谢。下面也有很多很好的答案,但这是完美的。 @SimeonVisser, "string".format(...) 在旧版 python 版本(例如 2.4)上无效 如果使用花括号,他们需要像this一样被转义。【参考方案2】:

注意:在 Python 中进行字符串格式化的推荐方法是使用format(),如the accepted answer 中所述。我将此答案保留为也受支持的 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)

一些阅读:

String formatting PEP 3101 -- Advanced String Formatting

【讨论】:

这并不完全一样,因为 OP 需要命名参数,而不是位置参数。 这仍然是一个很好的解决方案,并且对于多线插值它更直接。你不必导入任何东西,它使用常规的 python 插值。 "你可能用一点谷歌搜索就可以回答这个问题" 暗示我们在谷歌搜索后没有找到这篇文章...【参考方案3】:

您可以将Python 3.6's f-strings 用于multi-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."""

【讨论】:

这可以让你的源代码看起来很漂亮,并且在 Python3.6 之前的版本中,你可以通过这样做(额外的括号并使用+ 连接)获得相同的效果:***.com/a/54564926/4561887 三重引用是非常首选。您应该先出示该表格。 @jpmc26 我首先基于PEP 8's guidelines for code indentation提出了括号样式。为什么首选三引号? 我总是忘记 f 前缀来启用内联格式。但我喜欢这种多内联格式的方法。【参考方案4】:

这就是你想要的:

>>> 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\nstring3\n", '__name__': '__main__', 'string2': 'now', '__doc__': None, 'string1': 'go'
>>> print(mystring.format(**locals()))

I will go there
I will go now
great

【讨论】:

请注意,三重引号""" 保留换行符,这意味着在mystring 之前和之后有一个额外的换行符 您可以使用.strip().rstrip().lstrip(),或者在三引号内使用反斜杠以避免创建换行符。我的字符串 = """\ABC\ """【参考方案5】:

f-strings,也称为“格式化字符串文字”,是开头有f 的字符串文字;以及包含将被其值替换的表达式的花括号。

f-strings 在运行时被评估。

所以你的代码可以重写为:

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

您可以通过here了解更多信息。

【讨论】:

【参考方案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)

上述两种解决方案都会输出相同的结果:

我会去那里 我现在去 很棒

【讨论】:

【参考方案7】:

如果有人从 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)

确保像我一样转义所有花括号:“”、“”

【讨论】:

以上是关于如何使用内联变量创建多行 Python 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个字符串变量组合成一个多行变量?

如何将多行语句字符串放入变量中? [复制]

MASM x86 如何打印多行字符串变量?

python输出串多行数字空格

python | 变量与数据 | 字符串转义 | 输入多行

如何在 NMake 中创建和使用多行字符串变量?