你正在尋找的是俗稱模板什麼,你已經基本定義的模板語言。
取決於你想要做什麼正好你可以使用stdlib中的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
的對象)。
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。