加班程序員最辛苦,來張圖醒醒腦吧!
...
...
...
好了,醒醒吧,回歸現實看代碼了!!
執行字符串表示的函數,並為該函數提供全局變量
本篇的內容從題目中就可以看出來,就是為之后剖析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 18
上述代碼解析:
- 第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文件,再然后講分割的文件組成一個字符串表示的函數,再再然后就是利用上述方法執行字符串表示的函數。