一个简单的模版系统

一个简单模版系统的实现:

# templates.py



import fileinput, re



# 定义用于匹配字段的模式

field_pat = re.compile(r'\[(.+?)\]')



# 创建充当模版作用域的字典:以字典形式收集变量

scope = {}



# 定义替换函数,用于re.sub中

def replacement(match):

    # 返回模式中与给定子模式(组)匹配的子字符串

    code = match.group(1)

    try:

        # 若字段可以求值(求表达式的值),则返回其值

        return str(eval(code, scope))

    except SyntaxError:

        # 否则执行相同作用域内的语句(赋值语法或其他语句)

        exec(code, scope)

        # 返回空字符串

        return ''



# 将所有文本以一个字符串的形式获取

lines = []

for line in fileinput.input():

    lines.append(line)

text = ''.join(lines)

# print(text)



# 将field_pat模式的所有匹配项都用替换函数replacement替换掉

print(field_pat.sub(replacement, text))

简单模版示例:

[x = 2]

[y = 3]

the sum of [x] and [y] id [x + y]

运行程序:

一个简单的模版系统

修改替换函数replacement中的return ''为return 'test black line',运行结果:

这样可以清楚的看出,以上的输出,包含了3个空行,其中2个在输出文本的上方,一个在输出文本的下方。上方的2行是执行exec时返回的,下方的一行是print语句输出打印语句后默认的换行。

 因为使用了fileinput,所以可以轮流处理几个文件。这意味着可以使用一个文件用于定义变量值(文件名为define.txt),另一个文件用于插入这些值的模版文件(template.txt)。

(1)模版的定义

[name = 'huhu']

[language = 'python']

[email = '[email protected]']

(2)模版文件

[import time]



hello,[name]:

    

I would like to learn how to program.

I hear you use the [language] language a lot.

-- is it something I should consider?



and by the way. is [email] your correct email address?



hangzhou. [time.asctime()]



hengheng

运行程序:

一个简单的模版系统

 

你可能感兴趣的:(系统)