def replace(template, ctx): """Replace placeholders with their values and return the result. Example: >>> replace("$NAME is down", {"$NAME": "foo"}) foo is down This function explicitly ignores "variable variables". In this example, placeholder's value itself contains a placeholder: >>> replace("Hello $FOO", {"$FOO": "$BAR", "$BAR": "World"}) Wrong: Hello World Correct: Hello $BAR >>> replace("Hello $$FOO", {"$FOO": "BAR", "$BAR": "World"}) Wrong: Hello World Correct: Hello $BAR In other words, this function only replaces placeholders that appear in the original template. It ignores any placeholders that "emerge" during string substitutions. This is done mainly to avoid unexpected behavior when check names or tags contain dollar signs. """ parts = template.split("$") result = [parts.pop(0)] for part in parts: part = "$" + part for placeholder, value in ctx.items(): if part.startswith(placeholder): part = part.replace(placeholder, value, 1) break result.append(part) return "".join(result)