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`.