format()
方法很棒,但我想更改我选择的标识符,因为我不想在我的字符串中转义{
和}
。
e.g。
'Hi {name}'.format(**{'name': 'Alok'})
将打印'Hi Alok'
'Hi {{{name1}, {name2}}}'.format(**{'name1':'foo', 'name2':'bar'})
将打印'Hi {foo, bar}'
在第二个示例{
和}
是我的字符串的一部分,所以我必须使用{{
和}}
来转义它们。
我不想逃避{
和}
,甚至不想使用jinja之类的模板引擎等。如何更改标识符?我想有可能会使用子类str
类。
答案 0 :(得分:1)
当然你可以继承str类,但我会再次推荐这个。这是一个如何看起来的例子:
# -*- coding: utf-8 -*-
class FormattableString(str):
def format(self, symbols, *args, **kwargs):
start, end = symbols
prepared_string = self.replace(
start, '{').replace(end, '}')
return prepared_string.format(
*args, **kwargs)
if __name__ == '__main__':
f_string = FormattableString('Hello [name]')
print(f_string.format(('[', ']'), name='john'))
您还可以使用旧式的字符串格式。
'Hi {%(name1)s, %(name2)s}' % {'name1':'foo', 'name2':'bar'}
这是一个比较两种方法的链接https://pyformat.info/
我建议尽可能避免使用旧样式,但如果新样式使字符串混乱,那么使用旧样式对于特定用例更好。
答案 1 :(得分:1)
除了@blakev 的响应之外,您还可以子类化 colName
123
并覆盖将分隔符引入您的心脏内容的占位符。
string.Template
答案 2 :(得分:-1)
您可以使用String Templates进行基于$的替换,而不是{..}
但是,规则更简单,您将失去高级格式化功能,如对齐。
>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'