String-Ersetzungen verwenden von Vorlagen in Python

Einführung

Dem string-Modul hat eine Vorlage-Klasse, ermöglicht Ihnen die Ersetzungen in einem string durch ein mapping-Objekt, zum Beispiel:

>>> string.Template('var is $var').substitute({'var': 1})
'var is 1'

Die Ersatz-Methode auslösen kann, eine KeyError-Ausnahme aus, wenn ein Versuch gemacht wird, zu ersetzen, ein element, das fehlt die Zuordnung, zum Beispiel

>>> string.Template('var is $var and foo is $foo').substitute({'var': 1})
KeyError: 'foo'

oder auslösen kann, einen ValueError, wenn die Vorlage-Zeichenfolge ist ungültig, z.B. enthält es eine $ - Zeichen, gefolgt von einem Leerzeichen:

>>> string.Template('$ var is $var').substitute({'var': 1})
ValueError: Invalid placeholder in string: line 1, col 1

Das Problem

Gegeben, eine Vorlage-Zeichenfolge und eine Zuordnung, die ich will, um festzustellen, ob alle Platzhalter in der Vorlage ersetzt werden würde. Für diese, würde ich versuchen um die substitution und fangen KeyError-Ausnahme:

def check_substitution(template, mapping):
    try:
        string.Template(template).substitute(mapping)
    except KeyError:
        return False
    except ValueError:
        pass
    return True

Aber das funktioniert nicht, weil wenn die Vorlage ungültig und ein ValueError ausgelöst, anschließende KeyErrors nicht gefangen:

>>> check_substitution('var is $var and foo is $foo', {'var': 1})
False
>>> check_substitution('$ var is $var and foo is $foo', {'var': 1})
True

aber ich egal über ValueErrors. Also, was wäre der richtige Ansatz für dieses problem?

Vorlagen haben eine safe_substitute Methode, ignoriert, dass jeder ValueError und geht auf die Substitutionen. Das problem ist, es ignoriert auch KeyErrors.
Die möglichen ValueError Fällen sind alle im Zusammenhang mit illegaler Nutzung der $ Charakter, richtig? Also warum nicht tun ein wenig die Vorverarbeitung der string zu entkommen illegalen Nutzungen von $?
Dies könnte funktionieren, würde aber erfordern, herauszufinden, alle Fälle, die trigger eine ValueError.

InformationsquelleAutor Ernest A | 2012-10-07

Schreibe einen Kommentar