Python提供的調用可執行對象的內建函數進行說明,涉及exec、eval、compile三個函數。exec語句用來執行存儲在代碼對象、字符串、文件中的Python語句,eval語句用來計算存儲在代碼對象或字符串中的有效的Python表達式,而compile語句則提供了字節編碼的預編譯。
python
本函數是用來動態地執行一個表達式的字符串,或者compile函數編譯出來的代碼對象。參數expression是一個表達式字符串,或者表示編譯出來代碼對象的名稱;參數globals是全局命名空間,能夠指定執行表達式時的全局做用域的範圍,好比指定某些模塊能夠使用。若是本參數缺省,就使用當前調用這個函數的當前全局命名空間;參數locals是局部做用域命名空間,是用來指定執行表達式時訪問的局部命名空間。若是全局命名空間參數出現,但缺省內置模塊,那麼會自動拷貝這個模塊到全局命名空間,意味着不管怎麼設置,均可以使用內置模塊。若是兩個命名空間,都使用缺省方式,就會使用調用這個函數時的命名空間來查找相應的變量。正則表達式
爲何要使用這個函數呢?這個函數的緣由,應該就是動態語言與編譯語言的差異之處,由於在編譯語言裏要動態地產生代碼,基本上是不可能的,但動態語言是能夠,意味着軟件已經部署到服務器上了,但只要做不多的更改,只好直接修改這部分的代碼,就可當即實現變化,不用整個軟件從新加載。另一個,這個功能能夠用來機器學習裏,好比根據用戶使用這個軟件頻率,以及方式,可動態地修改代碼,適應用戶的變化。想到這裏,是否是具備生命力的能力,能夠自我更新代碼,實現改良式進步,若是作破壞性的動做,其實就是一個病毒。使用exec和eval必定要注意安全性問題,尤爲是網絡環境中,可能給予他人執行非法語句的機會。express
eval就是python做爲動態語言的一個特色。可用做如下用途;安全
(1) 動態構造參數服務器
opts=struct.uppack(eval("b'%ds'"%(opts_len)),ip_header[20:])
(2)從外部字符串中生成python對象網絡
要想更安全的使用 eval , 參考:機器學習
http://code.activestate.com/recipes/496746-restricted-safe-/函數
http://stackoverflow.com/questions/15197673/using-pythons-eval-vs-ast-literal-eval學習
格式:compile( str, file, type )
編碼
compile語句是從type類型(包括’eval’: 配合eval使用,’single’: 配合單一語句的exec使用,’exec’: 配合多語句的exec使用)中將str裏面的語句建立成代碼對象。file是代碼存放的地方,一般爲」。
compile語句的目的是提供一次性的字節碼編譯,就不用在之後的每次調用中從新進行編譯了。
還須要注意的是,這裏的compile和正則表達式中使用的compile並不相同,儘管用途同樣。
>>> eval_code = compile( '1+2', '', 'eval') >>> eval_code <code object <module> at 0142ABF0, file "", line 1> >>> eval(eval_code) 3 >>> single_code = compile( 'print "pythoner.com"', '', 'single' ) >>> single_code <code object <module> at 01C68848, file "", line 1> >>> exec(single_code) pythoner.com >>> exec_code = compile( """for i in range(5): ... print "iter time: %d" % i""", '', 'exec' ) >>> exec_code <code object <module> at 01C68968, file "", line 1> >>> exec(exec_code) iter time: 0 iter time: 1 iter time: 2 iter time: 3 iter time: 4