361

红宝石示例:

name = "Spongebob Squarepants"
puts "Who lives in a Pineapple under the sea? \n#{name}."

成功的 Python 字符串连接对我来说似乎很冗长。

4

9 回答 9

435

Python 3.6 将添加类似于 Ruby 的字符串插值的文字字符串插值。从该版本的 Python(计划于 2016 年底发布)开始,您将能够在“f-strings”中包含表达式,例如

name = "Spongebob Squarepants"
print(f"Who lives in a Pineapple under the sea? {name}.")

在 3.6 之前,您最接近的是

name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? %(name)s." % locals())

%运算符可用于Python 中的字符串插值。第一个操作数是要插值的字符串,第二个操作数可以有不同的类型,包括“映射”,将字段名称映射到要插值的值。这里我使用局部变量的字典locals()将字段名称映射name到它的值作为局部变量。

使用最近 Python 版本的方法的相同代码.format()如下所示:

name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? {name!s}.".format(**locals()))

还有string.Template类:

tmpl = string.Template("Who lives in a Pineapple under the sea? $name.")
print(tmpl.substitute(name="Spongebob Squarepants"))
于 2010-12-15T13:52:28.653 回答
149

从 Python 2.6.X 开始,您可能希望使用:

"my {0} string: {1}".format("cool", "Hello there!")
于 2010-12-15T14:44:50.970 回答
32

我开发了interpy包,它可以在 Python 中启用字符串插值

只需通过pip install interpy. 然后,# coding: interpy在文件开头添加该行!

例子:

#!/usr/bin/env python
# coding: interpy

name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n#{name}."
于 2014-01-08T02:03:04.823 回答
29

Python 的字符串插值类似于 C 的 printf()

如果你试试:

name = "SpongeBob Squarepants"
print "Who lives in a Pineapple under the sea? %s" % name

标签%s将替换为name变量。你应该看看打印功能标签:http ://docs.python.org/library/functions.html

于 2010-12-15T14:06:24.037 回答
28

按照 PEP 498 中的规定,字符串插值将包含在 Python 3.6 中。您将能够做到这一点:

name = 'Spongebob Squarepants'
print(f'Who lives in a Pineapple under the sea? \n{name}')

请注意,我讨厌海绵宝宝,所以写这篇文章有点痛苦。:)

于 2015-10-21T16:25:35.187 回答
4

你也可以拥有这个

name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n{name}.".format(name=name)

http://docs.python.org/2/library/string.html#formatstrings

于 2013-12-12T10:34:27.443 回答
3
import inspect
def s(template, **kwargs):
    "Usage: s(string, **locals())"
    if not kwargs:
        frame = inspect.currentframe()
        try:
            kwargs = frame.f_back.f_locals
        finally:
            del frame
        if not kwargs:
            kwargs = globals()
    return template.format(**kwargs)

用法:

a = 123
s('{a}', locals()) # print '123'
s('{a}') # it is equal to the above statement: print '123'
s('{b}') # raise an KeyError: b variable not found

PS:性能可能有问题。这对本地脚本很有用,而不是生产日志。

重复:

于 2013-07-01T19:23:08.443 回答
2

对于旧 Python(在 2.4 上测试),最佳解决方案指明了方向。你可以这样做:

import string

def try_interp():
    d = 1
    f = 1.1
    s = "s"
    print string.Template("d: $d f: $f s: $s").substitute(**locals())

try_interp()

你得到

d: 1 f: 1.1 s: s
于 2016-10-04T20:52:51.470 回答
1

Python 3.6 和更高版本使用 f 字符串进行文字字符串插值:

name='world'
print(f"Hello {name}!")
于 2019-05-28T17:11:19.553 回答