python中的exec()函式和eval()函式
阿新 • • 發佈:2018-12-22
exec()函式
exec函式用於執行儲存在字串中的python語句
>>> exec("x=1") >>> x 1
但有時候,直接這樣執行可能會汙染我們的名稱空間,比如下面的例子,我們使用python內建的abs函式求絕對值。
>>> abs(-1) 1 >>> exec("abs='xyz'") >>> abs(-1) File "<stdin>", line 1, in <module> TypeError: "str" object is not callable
在執行abs函式時報錯了,型別錯誤,字串型別物件不能被呼叫,原因就在於我們使用exec函式將字串xyz賦值給了abs,abs此時已經不再表示求絕對值的函數了。為了防止出現這種情況,我們在呼叫exec函式時,可以給它傳遞第二個引數——名稱空間,即就是一個字典。
>>> abs(-1) 1 >>> scope = {} >>> exec("abs='xyz'", scope) >>> abs(-1) 1 >>>scope['abs'] 'xyz'
這樣,通過exec執行賦值語句建立的變數就位於scope中,不會汙染我們的名稱空間。
eval()函式
eval用於執行儲存在字串中的python表示式
>>> eval("1+2+3+4+5") 15
與exec函式一樣,我們也可以給eval函式提供名稱空間。
總結
1、exec函式執行的是python語句,沒有返回值,eval函式執行的是python表示式,有返回值;
2、exec函式和eval函式都可以傳入名稱空間作為引數,實際上,可以向exec函式和eval函式提供兩個名稱空間,他們的函式定義為:
exec(source, globals=None, locals=None)
eval(source, globals=None, locals=None)
其中globals和locals都是可選引數,globals表示全域性名稱空間,必須是字典,locals表示區域性名稱空間,可以是任何對映。
3、需要注意的是,exec函式和eval函式都是將使用者提供的字串作為程式碼執行,將無法控制程式碼的行為,會帶來嚴重的安全隱患,使用的時候要慎重。