您要查找的通常称为模板,并且您基本上已经定义了一种模板语言。
根据确切您想要做什么,您可以使用标准库中的string.Template 库。不过,它只进行简单的变量替换,而不是 ERb,后者允许任意代码(包括删除所有数据、格式化硬盘、启动后门的代码……)。
因此,string.Template 的功能远比 ERb 弱,但也更更安全。您的示例已经证明了这一点,因为您甚至无法从模板中访问环境变量,您必须显式传递它们。
这是基本用法:
from string import Template
s = Template('{"username": "Dan", "password": "$db_password"}')
s.safe_substitute(db_password = 's00persekrit')
# >>> {"username": "Dan", "password": "s00persekrit"}
由于无法在模板内访问环境变量,因此您必须将它们显式传递给模板:
from string import Template
from os import environ as env
s = Template('{"username": "Dan", "password": "$db_password"}')
s.safe_substitute(db_password = env['DB_PASSWORD'])
# >>> {"username": "Dan", "password": "s00persekrit"}
实际上,如果你想让模板访问所有环境变量,你应该可以直接传递os.environ dict(你可以传递任何dict-like 对象进行映射)。
from string import Template
from os import environ as env
s = Template('{"username": "Dan", "password": "$DB_PASSWORD"}')
s.safe_substitute(env)
# >>> {"username": "Dan", "password": "s00persekrit"}
如果您想要一些更强大的替换,那么您应该查看一些其他所谓的“无逻辑”模板语言(即只执行简单替换但不允许执行代码并且不允许条件的语言或循环)。其中一种语言是Mustache(GitHub 使用的模板语言),有多种语言的实现,包括Pystache for Python。
如果您想要/需要更高级的功能,例如循环、条件等,您可能需要寻找功能更全的template languages,例如Jinja。