在str.format()中将花括号更改为标识符

时间:2017-10-11 07:12:03

标签: python string subclassing

format()方法很棒,但我想更改我选择的标识符,因为我不想在我的字符串中转义{}

e.g。
'Hi {name}'.format(**{'name': 'Alok'})将打印'Hi Alok'

'Hi {{{name1}, {name2}}}'.format(**{'name1':'foo', 'name2':'bar'})
将打印'Hi {foo, bar}'

在第二个示例{}是我的字符串的一部分,所以我必须使用{{}}来转义它们。

我不想逃避{},甚至不想使用jinja之类的模板引擎等。如何更改标识符?我想有可能会使用子类str类。

3 个答案:

答案 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进行基于$的替换,而不是{..}

但是,规则更简单,您将失去高级格式化功能,如对齐。

文档:string.Template

>>> from string import Template 
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'