python神奇函式之eval()學習
python中有很多內建的很有用的工具函式,熟練地使用這些小工具絕對可以幫助你在工作中達到事半功倍的效果,今天由於需要用到了eval()函式,這個函式其實之前就用過了但是由於最近一直忙於看論文和方向上的一些其他的事,這個東西也就慢慢忘掉了,今天要用,索性直接再學一下,這裡就作為是學習的記錄了。
eval()官方文件裡面給出來的功能解釋是:將字串string物件轉化為有效的表示式參與求值運算返回計算結果
語法上:呼叫的是:eval(expression,globals=None, locals=None)返回的是計算結果
其中:
expression是一個參與計算的python表示式
globals是可選的引數,如果設定屬性不為None的話,就必須是dictionary物件了
locals也是一個可選的物件,如果設定屬性不為None的話,可以是任何map物件了
python是用名稱空間來記錄變數的軌跡的,名稱空間是一個dictionary,鍵是變數名,值是變數值。
當一行程式碼要使用變數 x 的值時,Python 會到所有可用的名字空間去查詢變數,按照如下順序:
1)區域性名字空間 - 特指當前函式或類的方法。如果函式定義了一個區域性變數 x, 或一個引數 x,Python 將使用它,然後停止搜尋。
2)全域性名字空間 - 特指當前的模組。如果模組定義了一個名為 x 的變數,函式或類,Python 將使用它然後停止搜尋。
3)內建名字空間 - 對每個模組都是全域性的。作為最後的嘗試,Python 將假設 x 是內建函式或變數。
python的全域性名字空間儲存在一個叫globals()的dict物件中;區域性名字空間儲存在一個叫locals()的dict物件中。我們可以用print (locals())來檢視該函式體內的所有變數名和變數值。
下面簡單演示一下eval()函式的使用: #!usr/bin/env python #encoding:utf-8 import math def eval_test(): l='[1,2,3,4,[5,6,7,8,9]]' d="{'a':123,'b':456,'c':789}" t='([1,3,5],[5,6,7,8,9],[123,456,789])' print '--------------------------轉化開始--------------------------------' print type(l), type(eval(l)) print type(d), type(eval(d)) print type(t), type(eval(t)) if __name__=="__main__": eval_test()
執行結果為: --------------------------轉化開始-------------------------------- <type 'str'> <type 'list'> <type 'str'> <type 'dict'> <type 'str'> <type 'tuple'> [Finished in 0.2s]
上面簡單演示的是eval在字串物件和list、dictinoary、tuple物件之間的轉換作用 眾所周知:
eval()的確是一個很便捷的工具,但是便捷使用不當的同時也會造成嚴重的安全問題,不少的文章和部落格都對eval()的安全性進行了相關的分析,在這裡我就不多說了,文章最後會給出一些不錯的參考資料,感興趣的話可以看一下。
如何來避免eval()帶來的安全性問題呢?在這裡給出兩點建議:
1、自行寫檢查函式;
2、使用ast.literal_eval:自行檢視DOCUMENT
參考:
Python:eval的妙用和濫用
python eval() Python eval 函式妙用 Python 中 eval 帶來的潛在風險 Python之eval()函式危險性淺析 --------------------- 作者:Together_CZ 來源:CSDN 原文:https://blog.csdn.net/together_cz/article/details/72640276?utm_source=copy 版權宣告:本文為博主原創文章,轉載請附上博文連結!