Python 我可以在模板字符串中使用切片吗?

Python 我可以在模板字符串中使用切片吗?,python,python-3.x,Python,Python 3.x,以下工作: from string import Template d = { "test" : "1234" } t = "This is a test: ${test}" s = Template(t).safe_substitute(d) print(s) 输出: 这是一个测试:1234 但是,如果我只想在输出中使用这是一个测试:12?我可以将模板字符串替换和切片结合起来吗 如果我将t更改为“这是一个测试:${test}[:2]”它将打印: 这是一个测试:1234[:2] 如果我将t更

以下工作:

from string import Template
d = { "test" : "1234" }
t = "This is a test: ${test}"
s = Template(t).safe_substitute(d)
print(s) 
输出:

这是一个测试:1234

但是,如果我只想在输出中使用
这是一个测试:12
?我可以将模板字符串替换和切片结合起来吗

如果我将
t
更改为
“这是一个测试:${test}[:2]”
它将打印:

这是一个测试:1234[:2]

如果我将
t
更改为
“这是一个测试:${test[:2]}”
它会打印:

这是一个测试:${test[:2]}

我不确定是否可以使用
str.format
,因为字符串和dict都是从文件中动态加载的


我不能使用
f
-字符串,因为我需要与Python 3.4兼容。

我很确定您不能直接在
模板中使用
字符串。
您可以尝试的一种解决方案是,通过使用格式字典,然后将它们组合起来,在创建模板之前有效地进行任何字符串格式设置

from string import Template
d = { "test" : "1234" }
format_dict = {"test": "{:2.2}"}
t = "This is a test: ${test}"
s = Template(t).safe_substitute({k: v.format(d[k]) for k, v in format_dict.items()})
print(s) 
输出:

这是一个测试:12

编辑:根据@Jon Clements注释,您可以执行此操作,因此只需为某些值指定格式

from string import Template
d = { "test" : "1234" }
format_dict = {"test": "{:2.2}"}
t = "This is a test: ${test}"
formatted = {k: str.format(format_dict.get(k, '{}'), v) 
             for k, v in d.items()}
s = Template(t).safe_substitute(formatted)
print(s)

u可以尝试<代码>模板(t).SuffixAdvor(d)[-:2 ] < /Cord>这个特殊情况下的@ SigJuthTress的可能副本,但是如果在模板字符串中间的某个地方进行替换,它将不起作用。@ MikeScotty,一个重复字典怎么样?code>s=Template(t).safe_替换({key:val[:2]代表key,val在d.items()中)
?尽管如此,当bucket的数量更多并且每次都这样做时,效率不是很高。应该可以将
string.Template
子类化并使其工作。可以使用
ast.parse
来解析切片语法。但我怀疑升级到支持f-string的python版本的工作量会更少。3.4已经到了生命的尽头。我喜欢这个想法。。。它似乎要求您为每个可能的项目指定一种格式,但是。。。您可以将其重新处理为类似于:
{k:format(v,format_dict.get(k'))for k,v in d.iteritems()}
。。。这意味着您将使用默认的
str()
格式从
d
获取所有可用项,除非您另有指定,而不是仅以
格式存在的项。它要求你有一个单独的dict格式,但我可以接受。