Template-Tags mit Python ohne regulären Ausdruck ersetzen


Ich habe mir in den letzten Tagen ein einfaches Remote-Execution-System mit Python zusammengeschraubt. In diesem werden Template-Tags in den Task-Definitionen verwendet, die dann durch entsprechende Werte ersetzt werden, die der User als Parameter oder auf Nachfrage durch das System angeben kann. Ein Beispiel: In der Task-Definition steht folgende Zeile:

remoterun wget http://apache.openmirror.de//httpd/httpd-{version}.tar.gz

Ziel ist es nun das Template-Tag ‚{version}‘ durch eine entsprechende Eingabe zu ersetzen. Python macht es uns hierbei recht einfach. Zwar wäre der erste Gedanke einen regulären Ausdruck zu verwenden, doch es geht auch ohne Import des re-Moduls.

Zuerstmal suchen wir uns den Anfang und das Ende des Tags:

mystr = 'remoterun wget http://apache.openmirror.de//httpd/httpd-{version}.tar.gz'
start = mystr.find('{')
end = mystr.find('}')

Wir können den User nach einem passenden Wert fragen und diesen einsetzen:

if start != -1 and end != -1:
    # den User nach einem passenden Wert fragen
    val = raw_input('Please enter a value for \'' + mystr[start + 1:end] + '\': ')
    # Wert einsetzen
    mystr = mystr.replace('{' + mystr[start + 1:end] + '}', val)

Oder wir nutzen ein Dictionary mit den entsprechenden Werten, um die Tags zu ersetzen. Das Dictionary kann man z.B. aus einer Parameter-Liste generieren, die der User dem Skript mitgibt. Hier im Beispiel wird es der Anschaulichkeit halber direkt initialisiert.

mydict = {'version': '2.4.18', 'key1': 'val1', ...}
for k in mydict:
    if mystr.find('{' + k + '}'):
        mystr.replace('{' + k + '}', mydict[k])

Wird im Dictionary kein passender Key gefunden, nutzen wir einfach als Fallback die Vorgehensweise aus dem ersten Beispiel um den User nach dem Inhalt für das unbekannte Tag zu fragen.

Auf diese Weise kann man sich sehr einfach ein Templating-System in Python basteln ohne schwer leserliche Regexen zu verwenden. Genutzt wird dabei die Fähigkeit von Python, dass Strings als Objekte gehandhabt werden, so dass automatisch Methoden wie find() und replace() für Strings zur Verfügung stehen. Für eine Liste der String-Methoden in Python siehe https://docs.python.org/2/library/string.html.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.