我无法弄清楚string templates发生了什么:
t = Template('cannot teach an ${dog.old} ${tricks.new}. ${why} is this ${not} working')
print t.safe_substitute({'dog.old': 'old dog', 'tricks.new': 'new tricks', 'why': 'OH WHY', 'not': '@#%@#% NOT'})
打印:
cannot teach an ${dog.old} ${tricks.new}. OH WHY is this @#%@#% NOT working
我认为大括号处理任意字符串。大括号中允许使用哪些字符,有什么方法可以将Template
子类化为我想做的事情吗?
答案 0 :(得分:5)
来自文档......
$ identifier命名匹配映射关键字“identifier”的替换占位符。默认情况下,“identifier”必须拼写Python标识符。 $ character后面的第一个非标识符字符终止此占位符规范。
句点是非标识符字符,大括号仅用于将标识符与相邻的非标识符文本分开。
答案 1 :(得分:4)
啊哈,我尝试了这个实验:
from string import Template
import uuid
class MyTemplate(Template):
idpattern = r'[a-z][_a-z0-9]*(\.[a-z][_a-z0-9]*)*'
t1 = Template('cannot teach an ${dog.old} ${tricks.new}. ${why} is this ${not} working')
t2 = MyTemplate('cannot teach an ${dog.old} ${tricks.new}. ${why} is this ${not} working')
map1 = {'dog.old': 'old dog',
'tricks.new': 'new tricks', 'why': 'OH WHY', 'not': '@#%@#% NOT'}
map2 = {'dog': {'old': 'old dog'},
'tricks': {'new': 'new tricks'}, 'why': 'OH WHY', 'not': '@#%@#% NOT'}
print t1.safe_substitute(map1)
print t1.safe_substitute(map2)
print t2.safe_substitute(map1)
print t2.safe_substitute(map2)
打印
cannot teach an ${dog.old} ${tricks.new}. OH WHY is this @#%@#% NOT working
cannot teach an ${dog.old} ${tricks.new}. OH WHY is this @#%@#% NOT working
cannot teach an old dog new tricks. OH WHY is this @#%@#% NOT working
cannot teach an ${dog.old} ${tricks.new}. OH WHY is this @#%@#% NOT working
所以第三个(print t2.safe_substitute(map1)
)有效。
答案 2 :(得分:1)
Python将您名称中的 .
解释为“访问实例old
的字段dog
”。请尝试使用_
或使dog
成为包含字段old
的对象。
AFAIR,只有有效的标识符和 .
在大括号之间是安全的。
[编辑]它位于您链接到的页面上:
${identifier}
相当于$identifier
。当有效标识符字符跟随占位符但不是占位符的一部分时,如"${noun}ification"
,则需要它。
和
"identifier"
必须拼写Python标识符。
表示:它必须是有效的标识符。
[EDIT2]似乎没有像我想象的那样分析标识符。因此,您必须在大括号中指定一个简单的有效Python标识符(并且您不能使用字段访问器语法),除非您创建自己的Template class实现。