【问题标题】:changing curly brace as identifier in str.format()在 str.format() 中将大括号更改为标识符
【发布时间】:2017-10-11 07:12:02
【问题描述】:

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

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

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

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

我不想转义{},甚至不想使用jinja 等模板引擎。如何更改标识符?我想会有办法使用子类化str 类。

【问题讨论】:

  • Suppose I dont want to escape { and } 那你想做什么?就目前而言,这个问题非常广泛。
  • ''' 我想会有办法使用子类 str 类。''' - 这听起来很糟糕 :)

标签: python string subclassing


【解决方案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'

【讨论】:

  • 不知道为什么这被否决了,就像一个魅力
【解决方案2】:

当然,您可能可以将 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/

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

【讨论】:

  • 这个解决方案不能解决我的目的,因为它仍然使用{} 进行替换。所以f_string = FormattableString('{Hello} [name]')如果不转义{}就无法工作
  • 啊啊真的我错过了那部分。你可以用同样的方式添加转义,不是吗?
【解决方案3】:

除了@blakev 的响应,您还可以继承string.Template 并覆盖占位符,将分隔符引入您的心脏内容。

In [1]: from string import Template

In [2]: class CustomTemplate(Template):
    ...:     delimeter = ':'
    ...:

In [3]: s = CustomTemplate(':who likes :what')
    ...: s.substitute(who='tim', what='kung pao')
Out[3]: 'tim likes kung pao'

【讨论】:

    猜你喜欢
    • 2012-04-21
    • 2021-10-12
    • 2020-07-17
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    相关资源
    最近更新 更多