我有以下模板
designor
问题是我在编写模板时不知道桌面上会有多少人。所以我想传递一个元组列表,如:
from string import Template
myTemplate = '''$heading
| Name | Age |
| ---- |---- |
'''
如何做到这一点?如果我只是添加一个带有元组的列表的占位符,这将无法工作,因为数据的周围格式将丢失。
我希望模板捕获格式和列表以捕获数据并将这两个元素分开。
结果应如下:
myTemplate.substitute(...=[("Tom", "23"), ("Bill", "43"), ("Tim", "1")])
答案 0 :(得分:1)
我建议Mustache。这是一个简单的模板引擎,可以满足您的需求。
答案 1 :(得分:1)
可能有理由不想导入功能齐全的模板引擎,例如想要在资源严重受限的环境中运行代码。如果是这样,在几行代码中做到这一点并不困难。
以下内容可以处理最多26个元素的元组列表,这些元素在模板字符串中以$ A到$ Z的形式显示,并返回模板扩展列表。
from string import Template
def iterate_template( template, items):
AZ=[ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i:i+1] for i in range(26) ] # ['A','B',... 'Z']
return [ Template(template).safe_substitute(
dict(zip( AZ, elem ))) for elem in items ]
编辑:为了提高效率,我应该将模板实例化一次,并在列表理解中多次使用它:
def iterate_template( template, items):
AZ=[ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i:i+1] for i in range(26) ] # ['A','B',... 'Z']
tem = Template(template)
return [ tem.safe_substitute( dict(zip( AZ, elem ))) for elem in items ]
使用示例
>>> table = [('cats','feline'), ('dogs','canine')]
>>> iterate_template('| $A | $B |', table )
['| cats | feline |', '| dogs | canine |']
>>> x=Template('$heading\n$stuff').substitute(
heading='This is a title',
stuff='\n'.join(iterate_template('| $A | $B | $C |',
[('cats','feline'), ('dogs', 'canine', 'pack')] ) ) # slight oops
)
>>> print(x)
This is a title
| cats | feline | $C |
| dogs | canine | pack |