2016-08-21 3 views
3

Ich habe Konfigurationsdateien einige formatiert als json einige formatiert als yaml. Ich möchte in der Lage sein, diese Konfigurationsdateien mit Werten zu lesen, die als Umgebungsvariablen kommen. zum Beispiel:Ruby's ERB-Like-Funktion in Python

{"username":"Dan", "password":"<%= ENV['DB_PASSWORD']%>"} 

Was bedeutet, dass das Kennwort abgefragt wird, wenn die JSON-Datei von Umgebungsvariablen Laden und die <%= ENV['DB_PASSWORD']%> mit konkretem Wert ersetzen.

Hinweis: 1. Die oben erwähnte Syntax ist wie bei der Verwendung von Ruby's nur zur Illustration verwendet 2. Ich bevorzuge eine Lösung von nativem Python ohne neue Python-Pakete zu installieren, aber wenn es keine gibt, werde ich das auch akzeptieren.

Antwort

1

Was Sie suchen ist allgemein Templating genannt, und Sie haben im Grunde eine Template-Sprache definiert.

Je nachdem, was genau Sie tun möchten, können Sie die string.Template Bibliothek von der STDLIB verwenden. Es tut nur einfache variable Ersetzungen, obwohl im Gegensatz zu ERb, beliebige Code (einschließlich Code, der alle Ihre Daten löscht, formatiert Ihre Festplatte, startet eine Hintertür, ...).

So string.Template ist sowohl viel weniger leistungsfähig als Erb, sondern auch viel sicherer. Ihr Beispiel demonstriert dies bereits, da Sie nicht einmal innerhalb einer Vorlage auf Umgebungsvariablen zugreifen können. Sie müssten sie explizit übergeben.

Dies ist die grundlegende Nutzung:

from string import Template 

s = Template('{"username": "Dan", "password": "$db_password"}') 

s.safe_substitute(db_password = 's00persekrit') 
# >>> {"username": "Dan", "password": "s00persekrit"} 

Als Variablen Umgebung zugreifen nicht möglich in der Vorlage ist, werden Sie sie in der Vorlage passieren müssen explizit:

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"} 

Eigentlich Wenn Sie der Vorlage Zugriff auf alle Umgebungsvariablen geben möchten, sollten Sie in der Lage sein, das os.environ dict direkt zu übergeben (Sie können ein beliebiges dict -ähnliches Objekt für das Mapping übergeben).

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"} 

Wenn Sie einige leistungsfähigeren Substitutionen wollen, dann sollten Sie auf einige andere sehen so genannte „Logik-less“ Template-Sprachen (dh Sprachen, die nur einfache Substitutionen führen aber nicht zulassen, Code auszuführen, und don Bedingungen oder Schleifen nicht zulassen. Eine dieser Sprachen ist Mustache (die von GitHub verwendete Template-Sprache), es gibt Implementierungen in vielen Sprachen, einschließlich Pystache for Python.

Wenn Sie erweiterte Funktionen wie Loops, Conditionals usw. benötigen/benötigen, müssen Sie möglicherweise nach weiteren Funktionen wie template languages wie Jinja suchen.