解决了pyTenjin的IndentationError问题

标签:Python

前几天试用pyTenjin时遇到个奇怪的问题,if、for这种需要缩进的语句经常会出现这种错误:
IndentationError: unexpected indent
而且恼火的是,在一个页面这样写没问题,另一个页面用同样的结构就会出错,甚至只是多了个空行也会报错。
我翻遍了pyTenjin所有的文档,在Google上搜索了半天,仍没找到解决办法。

之后又是悲剧地重装系统,于是打印了一份pyTenjin的源文件来看,不过还没看完就装好了,便又停止研究了。
刚才终于闲了下来,又拿着源码读了下,立刻发现问题所在了(这里只列出关键代码,完整代码从tenjin.py的389行开始):
class Template(object):

    ## default value of attributes
    indent     = 4 # 注意这里

    def __init__(self, filename=None, encoding=None, escapefunc=None, tostrfunc=None, indent=None, preamble=None, postamble=None, smarttrim=None):
        """Initailizer of Template class.

           indent:int (=4)
             Indent width.
        """
        if indent     is not None:  self.indent     = indent
就是这个indent变量害的,源代码强制使用4个空格来缩进,而我在写html代码时,为了减少传输量,习惯用1个Tab或2个空格来缩进,于是就和要求的不符了。
解决办法很简单,习惯2个空格的,就把indent设为2;习惯1个tab的,就设为8。

顺带一提,在缩进时,空格放在<?py ... ?>里面和前面都是一样的(我习惯放前面,看上去更美观),只要保证符合你的设置即可。
另外,py后面必须有1个空格,而且是不计算在缩进字符内的。

最后想说的是,pyTenjin的代码很巧妙,直接用Python的exec()来执行模板compile成的字节码,因此性能非常好。而像Java等静态语言是没有exec()的,因此必须自己实现一个小型的解释器;甚至不少Python模板也是采用这种策略。
从作者给出的版本都是动态语言可以看出,Tenjin应该都是采用这种实现方式的。
此外,phpTenjin的性能非常抢眼,虽然参与比较的还只是0.0.1版。

0条评论 你不来一发么↓

    想说点什么呢?