2017-10-11 44 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我錯過了那部分。你可以添加以同樣的方式逃脫嗎? –