【问题标题】:Python: format string with custom delimiters [duplicate]Python:带有自定义分隔符的格式字符串[重复]
【发布时间】:2016-06-05 02:26:28
【问题描述】:

已编辑

我必须用字典中的值格式化一个字符串,但该字符串已经包含大括号。例如:

raw_string = """
    DATABASE = {
        'name': '{DB_NAME}'
   }
"""

当然,raw_string.format(my_dictionary) 会导致 KeyErro。

有没有办法使用不同的符号来与.format() 一起使用?

这不是 How can I print literal curly-brace characters in python string and also use .format on it? 的副本,因为我需要保持花括号原样,并为 .format 使用不同的分隔符。

【问题讨论】:

标签: python syntax format string-interpolation cheetah


【解决方案1】:

我认为不可能使用其他分隔符。对于不想被format()替换的花括号,你需要使用双花括号{{}}

inp = """
DATABASE = {{
    'name': '{DB_NAME}'
}}"""

dictionary = {'DB_NAME': 'abc'}
output = inp.format(**dictionary)
print(output)

输出

DATABASE = {
    'name': 'abc'
}

【讨论】:

  • 不错的答案。如需进一步参考,stackoverflow.com/questions/5466451/…
  • Mhm... 我的字符串来自一个复杂的文件(Django 的 settings.py),我希望模板与它来自的文件相似。我当然可以做双重替换,但我正在寻找更优雅的解决方案
【解决方案2】:

在 python string.format() 中使用自定义占位符标记

上下文

  • python 2.7
  • string.format()
  • 允许自定义占位符语法的替代方法

问题

我们想在 python str.format() 中使用自定义占位符分隔符

  • string.format() 功能强大,但不支持修改占位符分隔符。
  • string.format() 使用花括号,这很常见并导致 Delimiter collision
  • string.format() 默认的解决方法是将分隔符加倍,这可能很麻烦。

解决方案

我们编写了一个扩展原生 python 的自定义类str.format()

  • 使用自定义类扩展原生 python string.Formatter
  • 配置string.format() 以支持任意分隔符占位符语法
  • 允许其他增强功能,例如自定义格式化程序和过滤器

Example001:自定义 ReFormat 类的演示使用

  • 我们编写了一个自定义的ReFormat 类,它扩展了python str.format()
# import custom class
import ReFormat

# prepare source data
odata = { "fname" : "Planet",
          "lname" : "Earth",
          "age"   : "4b years",
         }

# format output using .render() 
# method of custom ReFormat class
#
vout = ReFormat.String("Hello <%fname%> <%lname%>!",odata).render()
print(vout)

陷阱

  • 需要扩展类到str.format()
  • 不能替代成熟的沙盒兼容模板解决方案

【讨论】:

  • 与 pystache github.com/defunkt/pystache 等替代模板系统相比如何?
  • 这种方法不能很好地替代成熟的模板系统,因为这些系统旨在允许没有编程经验的设计人员完成基本任务。这种方法与以 python 为中心的项目更兼容,在该项目中,大多数或所有与代码交互的人都会知道一些 python。它基本上是在 str.format() 本身之上几个缺口,在 Jinja2 之下几个缺口。
  • github 链接现在失效了。
  • ReFormat 的实现在哪里?
猜你喜欢
  • 2014-01-13
  • 2013-05-16
  • 2012-03-05
  • 2016-03-16
  • 1970-01-01
  • 2019-12-20
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多