plusieurs remplacements de texte en chaîne par marqueurs

voix
0

J'ai un fichier xml qui est utilisé comme modèle. J'ai plusieurs marqueurs à l'intérieur ce xml qui seront remplacées par des données réelles. C'est ce que j'ai fait:

def populate_template(self, value1, value2, value3):
        with open('my_template.xml', 'rb') as xml_template:
            template_string = xml_template.read()

        template_string.replace('`MARKER_1`', value1)
        template_string.replace('`MARKER_2`', value2)
        template_string.replace('`MARKER_3`', value3)  
        return template_string

Chaque marqueur peut apparaître plusieurs fois à l' intérieur du modèle.
Je me demandais s'il y a un moyen plus efficace de le faire?
Trucs Tech:

  • Python 2.7
Créé 20/09/2016 à 09:23
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

Oui. Utilisez le jinja2module templating. Pour utiliser votre modèle existant que vous pourriez faire quelque chose comme ceci:

def populate_template(self, value1, value2, value3):
    from jinja2 import Template
    t = Template(open('my_template.xml', 'r').read())
    output = t.render(MARKER_1=value2, MARKER_2=value2, MARKER_3=value3)
    return output

Il vaut bien étudier les différentes façons dont vous pouvez transmettre des arguments au modèle, aussi. Par exemple aurait pu être écrit que le même code ...

    ...
    context = {'MARKER_1': value1, 'MARKER_2', value2, 'MARKER_3': value3}
    output = t.render(**context)

et vous pouvez utiliser cette astuce avec tous les vieux dicts vous arrive d'avoir traîner. Il est un excellent moyen d'extraire des informations lisibles à partir dicts sélective.

Les concepteurs de jinja2, étant les cookies intelligents sympathiques à la cause de Python, ont en fait vous aider en vous permettant de fournir le contexte dans l' une des façons dont vous pouvez créer un dict (arguments de mots clés, une liste de (key, value)tuples ou un dict - y compris d' autres les choses comme dict telles que collections.OrderedDict). Donc , vous pouvez aussi écrire la deuxième ligne comme

    output = t.render(context)

qui est à la fois plus lisible et plus efficace (que je devine, mais il est une supposition éclairée).

Créé 20/09/2016 à 09:33
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more