from:
python:eval的妙用和濫用:
python eval():
python eval 函式妙用:
python 中 eval 帶來的潛在風險:
python之 eval() 函式危險性**:
eval()函式十分強大,官方文件解釋是:將字串 string 物件 轉化為有效的表示式參與求值運算返回計算結果
語法上:呼叫的是:eval(expression,globals=none, locals=none)返回的是計算結果
so,結合 math 當成乙個計算器很好用。
可以把 list、tuple、dict 和 string 相互轉化
其中:expression 是乙個參與計算的 python 表示式
globals 是可選的引數,如果設定屬性不為 none 的話,就必須是 dictionary 物件了
locals 也是乙個可選的物件,如果設定屬性不為 none 的話,可以是任何 map 物件了
python 是用命名空間來記錄變數的軌跡的,命名空間是乙個dictionary,鍵是變數名,值是變數值。
當一行**要使用變數 x 的值時,python 會到所有可用的名字空間去查詢變數,按照如下順序:
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]
a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
b = eval(a)
bout[3]: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
type(b)
out[4]: list
a = ""
b = eval(a)
bout[7]:
type(b)
out[8]: dict
a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
b = eval(a) b
out[11]: ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
eval 函式就是實現list、dict、tuple與 str 之間的轉化
str 函式把 list,dict,tuple 轉為為 字串
# 字串轉換成列表
a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
print(type(a))
b = eval(a)
print(b)
# 字串轉換成字典
# 字串轉換成元組
上面簡單演示的是eval在字串物件和list、dictinoary、tuple物件之間的轉換作用。
不可謂不強大!
but!強大的函式有代價。安全性是其最大的缺點。
想一想這種使用環境:需要使用者輸入乙個表示式,並求值。
如果使用者惡意輸入,例如:__import__('os').system('dir')
那麼 eval() 之後,你會發現,當前目錄檔案都會展現在使用者前面。
eval(__import__('os').system('dir'))
那麼繼續輸入:open('檔名').read()
**都給人看了。獲取完畢,一條刪除命令,檔案消失。哭吧!
眾所周知:
怎麼避免安全問題?
1、自行寫檢查函式;
2、使用 ast.literal_eval:自行檢視document:
3、更多好文:restricted "safe" eval(python recipe):
python3中的eval和exec的區別與聯絡
看了很多網上的方法,寫入檔案後開啟檔案看確實不再是亂碼,但是從檔案中讀入json時發現了亂碼,可能是讀檔案預設的編碼格式不對。下面讀寫方法可行。注意,ensure ascii false可以保證不會以ascii格式編碼,保證中文的正常轉換 import js程式設計客棧on with open te...
python中的eval函式
eval 函式用來執行乙個字串表示式,並返回表示式的值。還可以把字串轉化為list tuple dict。eval函式的語法 eval expression globals locals 引數 expression 表示式。globals 變數作用域,如果被提供,必須是乙個字典物件。locals 變...
Python中的eval函式
一 簡介 eval函式就是實現list dict tuple與str之間的轉化,而str函式實現把list dict tuple轉換成字串 1 字串轉化為列表 1 字串轉化為列表 2 a 1,2 3,4 5,6 7,8 9,10 3 print type a 4 b eval a 5print ty...