1. 程式人生 > >python中的exec()函式和eval()函式

python中的exec()函式和eval()函式

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函式都是將使用者提供的字串作為程式碼執行,將無法控制程式碼的行為,會帶來嚴重的安全隱患,使用的時候要慎重。