字符串格式化命名参数?


134

我知道这是一个非常简单的问题,但我不知道该如何使用Google。

我能怎么做

print '<a href="%s">%s</a>' % (my_url)

所以要my_url使用两次?我假设我必须“命名” the %s,然后在参数中使用字典,但是我不确定正确的语法吗?


仅供参考,我知道我可以my_url在参数中使用两次,但这不是重点:)


问题的标题有点误导。这与print语句无关,只是与字符串插值的工作原理无关。
格雷格·鲍尔

如果您不知道如何搜索它,请转到此处使用搜索:python.org/doc。由于一个重要原因,它比Google更好。
S.Lott

@
S.Lott

Answers:


79

在Python 2.6+和Python 3中,您可能选择使用更新的字符串格式化方法。

print('<a href="{0}">{0}</a>'.format(my_url))

这样可以避免重复输入参数,或者

print('<a href="{url}">{url}</a>'.format(url=my_url))

如果要命名参数。

print('<a href="{}">{}</a>'.format(my_url, my_url))

这是严格的位置,只有警告:format()参数遵循Python规则,其中必须首先使用未命名的args,然后是命名参数,然后是* args(类似于list或tuple的序列),然后是* kwargs(一种dict如果您知道什么对您有好处,请使用字符串进行键控)。首先通过将命名值替换为它们的标签来确定插值点,然后从剩下的位置进行定位。因此,您也可以这样做...

print('<a href="{not_my_url}">{}</a>'.format(my_url, my_url, not_my_url=her_url))

但这不是...

print('<a href="{not_my_url}">{}</a>'.format(my_url, not_my_url=her_url, my_url))

很高兴看到影响力从++转变为#
cod3monk3y 2014年

3
上面的方法不适用于命名字符串格式,这是位置字符串格式。因此,这并不能真正回答问题。
jaapz 2014年

"literal {arg1}".format(arg1="arg!")已命名的格式对Python 3.5,而更简洁f"literal {arg1}"是在Python 3.6或更高版本,据我所知一个较新的创新。
MarkHu '19

218
print '<a href="%(url)s">%(url)s</a>' % {'url': my_url}

3
我更喜欢用kwargs创建字典:'<a href="%(url)s">%(url)s</a>' % dict(url=my_url)
schlamar

11
我不知道你为什么喜欢那个schmlamar?与OP所使用的命令的正常声明相比,我将不知道这是什么意思
GreenAsJade

1
文档没有说明何时引入,因此可能适用于所有Python 2版本。
Evgeni Sergeev

2
如果可以,请使用format(),它可以在更多地方更好地工作。如果必须,请使用%。
uchuugaka

39

Python 3.6+中的解决方案

Python 3.6引入了文字字符串格式化,因此您可以格式化命名参数,而无需在字符串外重复任何命名参数:

print(f'<a href="{my_url:s}">{my_url:s}</a>')

这将进行评估my_url,因此,如果未定义,您将获得NameError。实际上,my_url您可以编写一个任意的Python表达式(而不是),只要它的计算结果为字符串(由于:s格式代码)即可。如果要为表达式的结果表示字符串表示形式(可能不是字符串),请替换:s!s,就像一般,预文字字符串格式化。

有关文字字符串格式的详细信息,请参阅PEP 498(首次引入该格式)。


1
PEP似乎并没有涵盖所有格式化程序。我认为它们与此处记录的str.format相同:docs.python.org/3.4/library/string.html#formatstrings
mpen

6

您将沉迷于语法。

同样是C#6.0,EcmaScript开发人员也熟悉此语法。

In [1]: print '{firstname} {lastname}'.format(firstname='Mehmet', lastname='Ağa')
Mehmet Ağa

In [2]: print '{firstname} {lastname}'.format(**dict(firstname='Mehmet', lastname='Ağa'))
Mehmet Ağa

5

对于构建HTML页面,您要使用模板引擎,而不是简单的字符串插值。


2
Django的模板引擎也可能是您制作电子邮件的理想工具。
Mike Graham

6
是什么让您无法使用Django模板及其render()方法生成电子邮件正文?没什么,您不必将模板输出提交到HttpResponse()。Django具有令人尴尬的通用性。
Mike DeSimone

1
@Mike:我以为 Django也可能有解决方案,但是我还没有找到它:p我可能会将电子邮件移到模板中!谢谢。也许我有点迟疑,但是我发现它在某些方面非常僵化。
mpen 2010年

2
@random阅读这些评论的人:在此处找到了如何执行此操作的
mpen 2010年

1
要对问题发表评论,您要使用评论,而不是答案。
2014年

2

与字典方式一样,了解以下格式可能会很有用:

print '<a href="%s">%s</a>' % (my_url, my_url)

这是一点点的冗余,并且在修改代码时,字典方式当然不易出错,但是仍然可以使用元组进行多次插入。第%s一个元素替换了元组中的第一个元素,第二%s个元素替换了元组中的第二个元素,以此类推。


我刚刚告诉一个建议这样做的人:)他删除了自己的帖子。我现在感觉不好。是的,我知道我可以做到这一点,但这不是我想要的。如您所说,它是多余的,my_url实际上是一个函数调用,我不想被两次评估。两次
还算

5
我想我会保留我的,以防万一它可以帮助别人。那么字典方式可能是最好的选择。但是为了冗余,(get_my_url(), )*20只调用一次函数,然后将其复制20次。
Ponkadoodle
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.