Ruby示例:

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


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

评论

这里的问题是name是位于字符串中的局部变量,在Python中,如果要使用局部变量的字典,则必须将其显式传递给字符串格式化程序。

这不是原始问题,但谢谢。您的评论使我对可变范围有了更好的理解(我仍然对此有所了解)。 :)

那么,您对此有何看法? stackoverflow.com/questions/16504732 / ...

PEP 215-字符串插值-被python.org/dev/peps/pep-0292
取代
有关3.6中的此确切功能,请参见stackoverflow.com/a/33264516/55721

#1 楼

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"))


评论


@Caste参见此处:docs.python.org/library/stdtypes.html#string-formatting,如果需要更多详细信息,请发表后续评论

–mikej
2010-12-15 13:59

我了解它的基本要点,但是我不完全理解文档示例中找到的所有其他符号和文本。为什么在此处使用转换为字符串:%(language)s'03d'中的3表示什么?为什么字符串后面有%\?在打印表达式之后分配变量(如果实际上是变量)也使我感到困惑。抱歉,这很痛苦!

–粘贴
2010-12-15 14:07



示例中使用的两种基本格式是%s表示字符串,%03d表示填充到3位数字前的零。它可以只写为“%s has%03d”%(“ Python”,2)。然后,该示例利用将映射键放在%之后的方括号中,这是一种为占位符提供有意义的名称的方式,而不是依赖于其在字符串中的顺序。然后,您传递一个将键名映射到其值的字典。这就是Sven使用locals()函数的原因,该函数返回一个包含所有局部变量的字典,因此它将name映射为name的值

–mikej
2010-12-15 14:15

首先使我困惑的是转换类型的必需用法。因此,使用文档术语。 %启动说明符。没有(语言)的转换标志,只有转换类型(尾随的“ s”); (数字)具有一个(或两个)转换标志,分别为“ 0”(和“ 3”)。 “ d”是转换类型,表示它是整数。我理解正确吗?

–粘贴
2010-12-15 14:32

@Caste:是的,基本上是正确的。请注意,您始终可以将s用作转换类型-Python可以将几乎所有内容转换为字符串。但是,您当然会失去其他转换类型的特殊格式化功能。

– Sven Marnach
2010-12-15 14:37

#2 楼

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

"my {0} string: {1}".format("cool", "Hello there!")


评论


请注意,Python 3.x中不建议使用字符串内插的%运算符。 docs.python.org/dev/py3k/whatsnew/…宣布了从3.1开始弃用%的计划,但这从未发生。

– Sven Marnach
2010-12-15 14:52

%语法仍然存在于Python 3中(从Python 3.2开始不推荐使用)

– Corey Goldberg
2010-12-15 17:49

请注意:{}中的数字可以消除。

–画
2015年3月30日,下午2:55

#3 楼

我已经开发了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}."


评论


这似乎真的不安全。

– d33tah
2015年12月12日下午16:01

@ d33tah:不,只要在编译时就知道字符串即可。

–Clément
16 Dec 8'在0:59

#4 楼

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

评论


我如何用2个变量来做到这一点?

–朱利奥·马林斯(Julio Marins)
15年7月15日在22:39

@JulioMarins使用元组:打印“第一个是%s,第二个是%s”%(var1,var2)。

–kirbyfan64sos
2015年11月5日在20:07

#5 楼

PEP 498中指定的Python 3.6将包含字符串插值。您将可以执行以下操作:

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


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

评论


那个海绵宝宝参考(/ disaste)的想法:现在得投票支持。

– StephenBoesch
17年11月16日在3:47

#6 楼

您也可以拥有此

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

评论


我不认为OP打算印刷#号。他们只是使用Ruby语法。

– Jaynp
15年1月3日,21:02

你是对的。我编辑了答案。我不熟悉Ruby,所以我认为#字符会被打印出来。

–全权
2015年2月4日,11:14

#7 楼

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:性能可能有问题。这对本地脚本很有用,而不对生产日志有用。

重复项:


Python字符串格式:%vs.format
什么是Python相当于将表达式嵌入字符串中? (即Ruby中的“#{expr}”)
Ruby等同于Python的`s =“ hello,%s。%s在哪里?” %(“ John”,“ Mary”)`
是否有一个与Ruby的字符串插值等效的Python?


#8 楼

对于旧的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


#9 楼

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

name='world'
print(f"Hello {name}!")