Python: format string with custom delimiters [duplicate]

Solution 1:

I don't think it is possible to use alternative delimiters. You need to use double-curly braces {{ }} for curly braces that you don't want to be replaced by format():

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

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

Output

DATABASE = {
    'name': 'abc'
}

Solution 2:

Using custom placeholder tokens with python string.format()

Context

  • python 2.7
  • string.format()
  • alternative approach that allows custom placeholder syntax

Problem

We want to use custom placeholder delimiters with python str.format()

  • string.format() is powerful, but no native support for placeholder delimiter modification.
  • string.format() uses curly-brace which is very common and and causes Delimiter collision
  • string.format() default workaround is to double-up the delimiters, which can be cumbersome.

Solution

We write a custom class that extends native python str.format()

  • extend native python string.Formatter with custom class
  • configure string.format() to support arbitrary delimiter placeholder syntax
  • permit other enhancements such as custom formatters and filters

Example001: Demo use of a custom ReFormat class

  • we wrote a custom ReFormat class that extends 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)

Pitfalls

  • requires extension class to str.format()
  • not intended as a substitute for full-blown sandbox-compatible templating solution