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

Python 将花括号更改为str.format()中的标识符,python,string,subclassing,Python,String,Subclassing,format()方法很棒,但我想更改我选择的标识符,因为我不想在字符串中转义{和} e、 g. 'Hi{name}。格式(**{'name':'Alok'})将打印'Hi-Alok' 'Hi{{{{name1},{name2}}'。格式(**{'name1':'foo','name2':'bar'}) 将打印'Hi{foo,bar}' 在第二个示例中,{和}是字符串的一部分,因此我必须使用{{和}对它们进行转义 我不想逃避{和}甚至不想使用模板引擎等。如何更改标识符?我想有一种方法可以使用子类化

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

e、 g.
'Hi{name}。格式(**{'name':'Alok'})
将打印
'Hi-Alok'

'Hi{{{{name1},{name2}}'。格式(**{'name1':'foo','name2':'bar'})

将打印
'Hi{foo,bar}'

在第二个示例中,
{
}
是字符串的一部分,因此我必须使用
{{
}
对它们进行转义

我不想逃避
{
}
甚至不想使用模板引擎等。如何更改标识符?我想有一种方法可以使用子类化
str
类。

您可以使用基于$的替换来代替{..}

但是,规则更简单,并且会丢失高级格式功能,如对齐

文件:


当然,您可能会对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'}
这里有一个链接,比较这两种方法


我建议尽量避免使用旧样式,但是如果新样式使字符串混乱,那么对于特定的用例,使用旧样式可能更好。

假设我不想转义{和}
,那么您想怎么做?这个问题非常广泛。“我想应该有办法使用str类的子类化。”“”-听起来很糟糕:)这个解决方案没有解决我的问题,因为它仍然使用
{
}
作为substation。因此,如果不转义
{
}
的话,f_string=FormattableString({Hello}[name]')将无法工作,我确实错过了这一部分。你可以用同样的方式加入逃跑,不是吗?不知道为什么这会被否决,效果很好
'Hi {%(name1)s, %(name2)s}' % {'name1':'foo', 'name2':'bar'}