字符串格式命名参数?

mpe*_*pen 128 python string syntax

我知道这是一个非常简单的问题,但我不知道如何谷歌.

我能怎么做

print '<a href="%s">%s</a>' % (my_url)
Run Code Online (Sandbox Code Playgroud)

这样my_url两次使用?我假设我必须"命名" %s然后在params中使用dict,但我不确定正确的语法?


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

Ign*_*ams 215

print '<a href="%(url)s">%(url)s</a>' % {'url': my_url}
Run Code Online (Sandbox Code Playgroud)

  • 我想知道你为什么喜欢那个schmlamar?我不会很清楚这意味着什么,比较OP使用的dict的正常声明...... (11认同)
  • 我更喜欢用kwargs创建dict:''<a href="%(url)s">%(url)s </a>'%dict(url = my_url)` (3认同)
  • 如果可以,请使用format(),它可以更好地在更多地方使用.如果你必须使用%. (2认同)

Gre*_*all 69

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

print('<a href="{0}">{0}</a>'.format(my_url))
Run Code Online (Sandbox Code Playgroud)

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

print('<a href="{url}">{url}</a>'.format(url=my_url))
Run Code Online (Sandbox Code Playgroud)

如果你想要命名参数.

print('<a href="{}">{}</a>'.format(my_url, my_url))
Run Code Online (Sandbox Code Playgroud)

这是严格的位置,只有格言()参数遵循Python规则,其中未命名的args必须首先,然后是命名参数,然后是*args(像列表或元组一样的序列)然后*kwargs(一个字典)如果你知道什么对你有好处,请用字符串键入.首先通过在其标签处替换命名值来确定插值点,然后从左边的位置确定位置.所以,你也可以这样做......

print('<a href="{not_my_url}">{}</a>'.format(my_url, my_url, not_my_url=her_url))
Run Code Online (Sandbox Code Playgroud)

但不是这个......

print('<a href="{not_my_url}">{}</a>'.format(my_url, not_my_url=her_url, my_url))
Run Code Online (Sandbox Code Playgroud)

  • 上面的方法不适用于*named*字符串格式,但这是位置字符串格式.所以这并没有真正回答这个问题. (2认同)

ger*_*rit 36

Python 3.6+中的解决方案

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

print(f'<a href="{my_url:s}">{my_url:s}</a>')
Run Code Online (Sandbox Code Playgroud)

这将进行评估my_url,所以如果它没有定义,你会得到一个NameError.事实上,my_url您可以编写任意Python表达式,只要它计算为字符串(因为:s格式化代码),而不是.如果您想要一个表达式结果的字符串表示形式,可能不是一个字符串,请替换:s!s,就像使用常规的预文字字符串格式一样.

有关文字字符串格式的详细信息,请参阅第一次介绍它的PEP 498.

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

gun*_*sus 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
Run Code Online (Sandbox Code Playgroud)


Mik*_*ham 5

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

  • 是什么阻止你使用Django模板生成一个带有`render()`方法的电子邮件正文?没有什么说你必须将模板输出提供给`HttpResponse()`.Django*令人尴尬*多才多艺. (6认同)
  • Django的模板引擎也可能被证明是您正在制作的电子邮件的理想工具. (2认同)
  • 阅读这些评论的@random人员:在http://www.rossp.org/blog/2006/jul/11/sending-e-mails-templates/上找到了有关如何做到这一点的更多细节 (2认同)
  • 对于问题的评论,您需要使用评论,而不是答案。 (2认同)