Python: format string with custom delimiters

cheetah, format, python, string-interpolation, syntax

Solution

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

- str.format has a problem with exact preservation of whitespace around curly-brace when using this kind of approach

Problem

EDITED I have to format a string with values from a dictionary but the string already contains curly brackets. E.g.: ``` raw_string = """ DATABASE = { 'name': '{DB_NAME}' } """ ``` But, of course, `raw_string.format(my_dictionary)` results in KeyErro. Is there a way to use different symbols to use with `.format()`? This is not a duplicate of How can I print literal curly-brace characters in python string and also use .format on it? as I need to keep curly brackets just as they are and use a different delimiter for `.format`.

Original source

Related problems