Pour le “coucou” pas déclaré (t’inquiète, c’est de saison
), à mon avis, tu as oublié de le définir… En tout cas, chez moi, ce bout de code marche, en 3.2 comme en 2.6…
De toute façon, je persiste à penser que la solution avec dictionnaire est bien plus élégante et sûre, car elle est bornée (seul le contenu du dictionnaire est accessible). Pour le contenu, tu peux parfaitement mettre à jour les valeurs d’un dictionnaire quand tu veux, voire même en ajouter ou en supprimer, par exemple :
1 2 3 4 5
| rep_codes = {'coucou' : "hello"}
rep_codes['err_404'] = open("my/404/error.txt", "r").readall()
rep_codes['usr_nick'] = get_user_nickname()
del rep_codes['coucou']
#etc. |
De plus, si tu as besoin de plus de souplesse et de puissance, au lieu d’utiliser eval(), assigne des fonctions à ton dict (qui peuvent même récupérer des chaînes capturées par ta regex), par exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import datetime, re
rep_codes = {'coucou' : lambda : "hello", # une simple chaîne statique
'date' : lambda : str(datetime.date.today()), # la date du jour
}
def get_user_nickname():
# ici tu fais ta requête à la BD, par ex.
return "einstein"
rep_codes['usr_nick'] = get_user_nickname # pas de (), on assigne la fonction, pas son résultat !
maVar = '<p><% coucou %> <% usr_nick %> (<% date %>)<p>'
re.sub(r'<%\s*(.+?)\s*%>', lambda match: rep_codes.get(match.group(1), lambda : "")(), maVar) |
Ce qui produira :
'<p>hello einstein (2011-04-24)<p>'

PS : Je me doutais bien que c’était un genre de template qui était derrière tout ça
Partager