【问题标题】:String interpolation from collection type集合类型的字符串插值
【发布时间】:2019-11-08 15:58:12
【问题描述】:

我有一个字符串插值问题,我不确定如何解决。非常感谢任何帮助解决这个问题。

摘要:我有一个组成电子邮件正文的字符串模板。此字符串模板具有静态和动态内容。目的是用字典的帮助下提供的特定于上下文的值填充模板的所有动态部分。

问题:如果您查看代码和输出,我可以从字典中提取Key/Value第一次和第二次打印输出)。但是,当Values 成为listtuple 等集合类型时,我无法提取它们;尤其是文本的动态部分嵌入了[ ]( )第三个​​打印输出)。

是否可以从输出中避免 [ ]( ) 构造?我希望输出为

'foo', 'bar'

而不是

['foo', 'bar']

import string

values = {'dynamic': 'foo'}

t = string.Template("""
Static contents        : $dynamic
More static contents.
""")

print('Body:', t.substitute(values))

values = {'dynamic': 'foo, bar'}

print('Body:', t.substitute(values))

values = {'dynamic': ['foo', 'bar']}

print('Body:', t.substitute(values))

注意:给定的逻辑和示例仅代表我如何注入一个动态内容的想法。实际上,我有不止一个动态变量要填充。类似于 Mail Merge 在 Microsoft Word 中所做的事情。 例如:

values = {'surname': 'xxx',
'email':'something@email.com',
'title':'Mr',
'reference':'xxxxx'
'contacts':['a','b','c']
}

【问题讨论】:

  • 在使用t.substitute之前,您需要知道字典中存储的值的类型并将它们转换为所需的字符串。
  • @Error-SyntacticalRemorse,谢谢,线程已更新为更加明确。

标签: python python-3.x


【解决方案1】:

我不完全了解您到底想要什么,但为什么不使用带有字符串格式的常规字符串而不是使用模板?

例如:

t = """
Static contents : {dynamic}
More static contents.
"""

values = {
  'str': 'foo, bar',
  'dict': {'test': 'foo'},
  'list': ['foo', 'bar'],
  'list2': ["'foo'", "'bar'"],
}

print('Body:', t.format(dynamic=values['str']))
print('Body:', t.format(dynamic=', '.join(values['dict'].values())))

print('Body:', t.format(dynamic=str(values['list'])[1:-1]))
# OR (the less exception prone way)
print('Body:', t.format(dynamic=', '.join(values['list2'])))

输出:

Body:
Static contents : foo, bar
More static contents.

Body:
Static contents : foo, bar2
More static contents.

Body:
Static contents : 'foo', 'bar'
More static contents.

Body:
Static contents : 'foo', 'bar'
More static contents.

【讨论】:

  • 谢谢你,非常感谢。我知道模板是可以更好地处理我的案例的选项。最初的想法是有一个包含多个占位符的电子邮件模板,这些占位符将在运行时填充值。简而言之,您可以将其与 Microsoft Word 邮件合并所做的一样。如果我有一个占位符,你的方法肯定有效。但实际上我的模板中有更多的占位符。
  • 知道了,上面答案中的所有内容仍然适用于string.Template。只需将格式调用交换为替代调用即可。话虽如此,如果您正在执行邮件合并和高级模板,我个人仍然会坚持使用格式字符串,因为它们更强大。话虽如此,模板旨在更加用户友好。您将获得更多的格式化功能。 Read this answer。格式化可以按关键字或位置进行任意数量的占位符。它是在运行时完成的。
  • 我迟到了,它是一个现有的python代码。但在格式化字符串方面,我会尝试并完全支持您。
  • 由于模板尚不支持,我将继续使用带有一些迭代器的 f-string。谢谢你的cmets。我接受这个作为答案,因为您的代码可能对其他有类似问题并更喜欢建议格式的人有用。
  • 我的答案应该适用于模板。不要使用t.format(...),而是使用t.substitute(...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 2019-04-17
  • 2016-07-01
  • 2016-07-11
  • 2020-09-30
相关资源
最近更新 更多