假设我们要生成下面这样的 html 字符串:
| 
12345678
 | 
    welcome, Tom            age: 20        weight: 100        height: 170      | 
要求姓名以及  中的内容是根据变量动态生成的,也就是这样的:
没接触过模板的同学可能会想到使用字符串格式化的方式来实现:
| 
123456789101112131415161718
 | 
HTML = \’\’\’\’\’\’  def gen_html(person):    name = person[\’name\’]    info_list = [        \'{0}: {1}\’.format(item, value)        for item, value in person[\’info\’].items()    ]    info = \’\\n\’.join(info_list)    return HTML.format(name=name, info=info) | 
这种方案有一个很明显的问题那就是,需要拼接两个 html 片段。 使用过模板技术的同学应该很容易就想到,在 Web 开发中生成 HTML 的更常用的办法是使用模板:
| 
1234567891011121314
 | 
HTML = \’\’\’    welcome, {{ person[\’ name \’] }}            {% for item, value in person[\’info \’].items() %}        {{ item }}: {{ value }}        {% endfor %}     \’\’\’  def gen_html(person):    return Template(HTML).render({\’person\’: person}) | 
本系列文章要讲的就是如何从零开始实现一个这样的模板引擎( Template )。
使用技术
我们将使用将模板编译为 python 代码的方式来解析和渲染模板。 比如上面的模板将被编译为如下 python 代码:
| 
1234567891011121314151617181920212223
 | 
def render_function():    result = []     result.extend([        \'\\n\’ ,        \'welcome, \’         str (person [\’name\’]),        \'\\n\’,        \'    ])    for  item , value  in  person [\’info\’].items ():        result .extend ([            \'\’,            str (item ),            \’: \’,            str (value ),            \'\\n\’        ])    result .extend ([        \'\\n\’        ayon-syntax crayon-theme-github crayon-font-monaco crayon-os-pc print-yes notranslate\” data-settings=\” minimize scroll-always\” style=\” margin-top: 12px; margin-bottom: 12px; font-size: 13px !important; line-height: 15px !important;\”>
| 
12345678
 | 
    welcome, Tom            age: 20        weight: 100        height: 170      | 
 
 
要求姓名以及   中的内容是根据变量动态生成的,也就是这样的:
 
 
 
没接触过模板的同学可能会想到使用字符串格式化的方式来实现: 
 
| 
123456789101112131415161718
 | 
HTML = \’\’\’\’\’\’  def gen_html(person):    name = person[\’name\’]    info_list = [        \'{0}: {1}\’.format(item, value)        for item, value in person[\’info\’].items()    ]    info = \’\\n\’.join(info_list)    return HTML.format(name=name, info=info) | 
 
 
 
 
这种方案有一个很明显的问题那就是,需要拼接两个 html 片段。 使用过模板技术的同学应该很容易就想到,在 Web 开发中生成 HTML 的更常用的办法是使用模板: 
 
| 
1234567891011121314
 | 
HTML = \’\’\’    welcome, {{ person[\’ name \’] }}            {% for item, value in person[\’info \’].items() %}        {{ item }}: {{ value }}        {% endfor %}     \’\’\’  def gen_html(person):    return Template(HTML).render({\’person\’: person}) | 
 
 
 
 
本系列文章要讲的就是如何从零开始实现一个这样的模板引擎( Template )。 
使用技术
我们将使用将模板编译为 python 代码的方式来解析和渲染模板。 比如上面的模板将被编译为如下 python 代码: 
| 
1234567891011121314151617181920212223
 | 
def render_function():    result = []     result.extend([        \'\\n\’ ,        \'welcome, \’         str (person [\’name\’]),        \'\\n\’,        \'    ])    for  item , value  in  person [\’info\’].items ():        result .extend ([            \'\’,            str (item ),            \’: \’,            str (value ),            \'\\n\’        ])    result .extend ([        \'\\n\’        an class=\”crayon-o\”>=[[v[1],v[0]] for v in items]  | 
 
 
 |