简易python模板引擎其一

前言

  发现一个叫500lines的项目感觉不错,看着自己动手实现一下,这是模板引擎项目的第一篇文章

项目需求介绍

  简单得讲一下,这个模板引擎参考了Django的一些语法,主要实现了以下一些内容

  • 解析并打印变量的值
  • <!–2–>和带有内容提取出来转化为html文本,但实际上手感觉还是有不少问题。尤其是循环语句的处理,需要首先将其转为代码,然后再通过程序控制循环内内容的实现。这个项目的核心思路就是找到一种将代码和静态文本混杂的原始文本转化为代码或者纯静态文本。

  for,if与endfor,endif的闭合可以用栈来处理,参考左右括号的闭合验证。

  取属性操作可以替换成相应的方法,而过滤器则需要解析成相应方法并逐级嵌套。

  需要建立一套变量处理机制,尤其是区分局部变量和全局变量,全局变量应该从外部传入。

python中的一些小窍门

  1. python中有一个类型叫做function对象类型,function对象可以作为参数,返回值和其他对象以相同的方式使用。
    这里应用500lines说明文档中的原话。

    In Python, a method call on an object like result.append("hello") is executed in two steps. First, the append attribute is fetched from the result object: result.append. Then the value fetched is invoked as a function, passing it the argument "hello".

    意思是我们调用一个python方法的时候可以将这个python方法保存为一个python对象,然后多次传入参数来执行函数。这个项目中主要用来简化生成代码流程。类似于result_append=result.append,调用时result_append(‘hello’),将hello添加到结果代码的集合,待后期处理。

  2. getattr方法可以用来获取对象中的属性

  3. exec方法可以动态执行python代码并可以获取参与运行的全局变量

总结与提高

  已经完成除了解析注释以外的功能,但觉得还是对python的面向对象理解不充分,尤其是将解析实现全部放在构造器里,对各个类的属性抽取不充分等等。下一版将作出改进。

  希望能程序能支持,模板继承,自定义标签,还有elif,else等更复杂的逻辑。