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=""
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()
執行結果為:
--------------------------轉化開始--------------------------------
[finished in 0.2s]
上面簡單演示的是eval在字串物件和list、dictinoary、tuple物件之間的轉換作用
眾所周知:
eval()的確是乙個很便捷的工具,但是便捷使用不當的同時也會造成嚴重的安全問題,不少的文章和部落格都對eval()的安全性進行了相關的分析,在這裡我就不多說了,文章最後會給出一些不錯的參考資料,感興趣的話可以看一下。
如何來避免eval()帶來的安全性問題呢?在這裡給出兩點建議:
1、自行寫檢查函式;
2、使用ast.literal_eval:自行檢視document
參考:python:eval的妙用和濫用
python之函式eval()學習
python中有許多很有用的內建函式,比如 eval 這個函式。能夠熟練的使用這些內建函式可以起到很多事半功倍的功效。eval 官方文件裡面給出來的功能解釋是 將字串string物件轉化為有效的表示式參與求值運算返回計算結果。語法上 呼叫的是 eval expression,globals none...
Python之eval 函式的危險
python的eval 函式可以把字串 123 變成數字型別的123,pp3e上說它很危險,還可以執行其他命令!在家沒事,做了些試驗。果然,如果python寫的cgi程式中如果使用eval 而非int 來轉換諸如年齡這樣的輸入框中的內容時是非常危險的。不僅可以看見列出系統的全部檔案,還可以刪除檔案,...
Python之eval函式的用法
a 1,2,3 type a class str type eval a 將字串轉換為列表 class list b 1000 type b class str type eval b 將字串轉換為整形 class int c type c class str type eval c 將字串轉換為字...