Web模板引擎本质前奏

执行字符串表示的函数,并为该函数提供全局变量:

 1 #! /usr/bin/env python3
 2 
 3 namespace = {'name': 'zingp', 'data': [16, 19, 25]}
 4 
 5 code = '''def sayHi():return  "name %s ,age %d" %(name,data[1],) '''
 6 
 7 func = compile(code, '<string>', "exec")
 8 # print("func>>>:",func)
 9 exec(func, namespace)
10 # print(namespace)
11 result = namespace['sayHi']()
12 
13 print(result)

运行结果:name zingp ,age 19

上述代码解析:

  • 第5行,code是一个字符串,该字符串的内容是一个函数体。
  • 第7行,将code字符串编译成函数 sayHi
  • 第9行,将函数 sayHi添加到namespace字典中(key为 sayHi),同时也将python的所有内置函数添加到namespace字段中(key为__builtins__),这样,我们print(namespace)会得到以下一个字典:
1 {'sayHi': <function sayHi at 0x02036D20>, 'data': [16, 19, 25], 'name': 'zingp', '__builtins__': {python的所有内置函数...}}

而且namespace字典的中的key,value好比是一个个的全局变量:

1 name = 'zingp'
2 data = [16, 19, 25]
3 def sayHi():
4     return "name %s ,age %d" % (name,data[1],)
  • 第11行,执行sayHi函数并将返回值复制给result
  • 第13行,输出result

我了个擦,居然把字符串变成了函数并且还为该函数提供了全局变量,是不是很巧秒。这个功能其实就是python的web框架中模板语言部分至关重要的部分,因为在模板处理过程中,首先会读取html文件,然后分割html文件,再然后讲分割的文件组成一个字符串表示的函数,再再然后就是利用上述方法执行字符串表示的函数。

posted @ 2016-11-22 09:52  ZingpLiu  阅读(205)  评论(0编辑  收藏  举报
/* 登录到博客园之后,打开博客园的后台管理,切换到“设置”选项卡,将上面的代码,粘贴到 “页脚HTML代码” 区保存即可。 */