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