Substitutions de chaînes à l'aide de modèles en Python

Introduction

La chaîne de module a une classe de Modèle, qui vous permet de faire des substitutions dans une chaîne de caractères à l'aide d'une cartographie de l'objet, par exemple:

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

La méthode de substitution peut soulever une KeyError exception, si une tentative est faite pour remplacer un élément qui manque à la cartographie, par exemple

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

ou peut soulever une ValueError, si le modèle de chaîne n'est pas valide, par exemple, il contient un $ caractère, suivi par un espace:

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

Le Problème

Donné une chaîne de modèle et d'une cartographie, je veux déterminer si tous les place de titulaires de droits dans le modèle doit être remplacé. Pour cela, je voudrais essayer de faire de la substitution et de l'attraper tout KeyError exception:

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

Mais cela ne fonctionne pas, parce que si le modèle n'est pas valide et un ValueError est soulevée, à la suite KeyErrors ne sont pas pris:

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

mais je n'avez pas de soins sur ValueErrors. Alors, quelle serait la bonne façon d'aborder ce problème?

source d'informationauteur Ernest A