第四篇:白話tornado源碼之褪去模板外衣的前戲

加班程序員最辛苦,來張圖醒醒腦吧!html

...python

...程序員

...web

好了,醒醒吧,迴歸現實看代碼了!!框架

執行字符串表示的函數,併爲該函數提供全局變量

本篇的內容從題目中就能夠看出來,就是爲以後剖析tornado模板作準備,也是因爲該知識點使用的巧妙,全部就單獨用一篇來介紹了。廢話很少說,直接上代碼:函數

#!usr/bin/env python
#coding:utf-8
 
namespace = {'name':'wupeiqi','data':[18,73,84]}
 
code =  '''def hellocute():return  "name %s ,age %d" %(name,data[0],) '''
 
func = compile(code, '<string>', "exec")
 
exec func in namespace
 
result = namespace['hellocute']()
 
print result

此段代碼的執行結果是:name wupeiqi,age 18tornado

上述代碼解析:ui

  • 第6行,code是一個字符串,該字符串的內容是一個函數體。
  • 第8行,將code字符串編譯成函數 hello
  • 第10行,將函數 hello 添加到namespace字典中(key爲hello),同時也將python的全部內置函數添加到namespace字段中(key爲__builtins__),如此一來,namespace中的內容比如是一個個的全局變量,即
    name = wupeiqi
    data = [18,73,84]
    
    def hellocute():
        return  "name %s ,age %d" %(name,data[0],)
  • 第12行,執行Hello函數並將返回值複製給result
  • 第14行,輸入result

這段代碼用的非常巧妙有木有,亮瞎狗眼有木有,竟然把字符串變成了函數而且還爲該函數提供了全局變量。對於該功能,它就是python的web框架中模板語言部分相當重要的部分,由於在模板處理過程當中,首先會讀取html文件,而後分割html文件,再而後講分割的文件組成一個字符串表示的函數,再再而後就是利用上述方法執行字符串表示的函數。spa

相關文章
相關標籤/搜索