Search code examples
pythonsyntaxformatstring-interpolationcheetah

Format string with custom delimiters


I have to format a string with values from a dictionary, but the string already contains curly brackets. For example:

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

But, of course, raw_string.format(my_dictionary) results in KeyError.

Is there a way to use different symbols to use with .format()?

This is not a duplicate of How do I escape curly-brace ({}) characters characters in a string while using .format? as I need to keep curly brackets just as they are and use a different delimiter for .format.


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