Python:使用自定义分隔符格式化字符串

Python: format string with custom delimiters

已编辑

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

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.

使用不同的分隔符

我认为不可能使用其他分隔符。您需要使用双花括号 {{ }} 表示不想被 format():

替换的花括号
inp = """
DATABASE = {{
    'name': '{DB_NAME}'
}}"""

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

输出

DATABASE = {
    'name': 'abc'
}

将自定义占位符标记用于 python string.format()

上下文

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

问题

我们想将自定义占位符定界符与 python str.format()

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

解决方案

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

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

Example001:演示使用自定义 ReFormat class

  • 我们编写了一个扩展 python str.format()
  • 的自定义 ReFormat class
# 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)

陷阱

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