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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM