2016-09-20 2 views
0

私はテンプレートとして使用されるxmlファイルを持っています。 このxmlの中に実際のデータに置き換えられる複数のマーカーがあります。これは私がやったことです:
複数のテキスト置換マーカーによる文字列

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 

各マーカーは、テンプレート内で複数回出現することができます。
これを行うより効率的な方法があるのだろうかと思っていましたか?
テックのもの:

  • のPython 2.7

答えて

1

はい。 jinja2テンプレートモジュールを使用します。あなたはこのような何かを行うことができ、既存のテンプレートを使用するには:

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 

それはあなたにも、テンプレートに引数を渡すことができますさまざまな方法を検討する価値は十分にあります。例えば、同じコードを

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

...のように書かれている可能性があり、あなたが転がってきたために起こるすべての古いdictsと、このトリックを使用することができます。これは、dictsから可読情報を選択的に抽出するうまい方法です。

jinja2のデザイナーは、Pythonの理由に賛同するスマートなクッキーであり、実際にはdict(キーワード引数、(key, value)タプルまたはリストのリスト)を作成する方法でコンテキストを提供できるようにしてくれました。 dict - collections.OrderedDictのような他のdictのようなものを含む)。だから、あなたも(私は推測しているが、それは情報に基づいた推測です)の両方より読みやすく、より効率的である

output = t.render(context) 

として第2のラインを書くことができます。

+0

ありがとうございました。あなたのコードを 'Environment#get_template'メソッドでテンプレートを取得するように変更しました。ありがとう! –