2017-10-11 51 views
1

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

例如
'Hi {name}'.format(**{'name': 'Alok'})将打印'Hi Alok'

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

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

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

+1

'假设我不想逃跑{和}'那么你想要做什么?现在这个问题非常广泛。 –

+0

'''我猜想会有使用子类str类的方法。''' - 这听起来很糟糕:) –

回答

-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' 
0

当然你也可能继承str类,但我会建议againt这一点。这是如何看起来像这样的一个例子:

# -*- 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/

我会建议避免了老式风格可能的,但如果新的风格杂乱字符串,那么也许使用旧样式是特定更好用例。

+0

这个解决方案不能解决我的目的,因为它仍然使用'{'和'}'替代。 so'f_string = FormattableString('{Hello} [name]')'不会转义'{','}' –

+0

Aaah true我错过了那部分。你可以添加以同样的方式逃脱吗? –