日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python3 中的 eval 函数

發布時間:2024/7/23 python 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python3 中的 eval 函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

From:http://blog.csdn.net/zhanh1218/article/details/37562167

Python:eval的妙用和濫用:https://blog.csdn.net/zhanh1218/article/details/37562167
python eval():http://www.cnblogs.com/dadadechengzi/p/6149930.html
Python eval 函數妙用:http://www.cnblogs.com/liu-shuai/p/6098246.html
Python 中 eval 帶來的潛在風險:https://blog.csdn.net/u011721501/article/details/47298723
Python之 eval() 函數危險性淺析:https://www.jb51.net/article/51814.htm

?

?

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?會到所有可用的名字空間去查找變量,按照如下順序:

  • 1)局部名字空間 - 特指當前函數或類的方法。
    ? ? ? 如果函數定義了一個局部變量?x, 或一個參數?x,Python?將使用它,然后停止搜索。
  • 2)全局名字空間 - 特指當前的模塊。如果模塊定義了一個名為?x?的變量,函數或類,Python?將使用它然后停止搜索。
  • 3)內置名字空間 - 對每個模塊都是全局的。作為最后的嘗試,Python?將假設?x?是內置函數或變量。

python 的全局名字空間存儲在一個叫 globals() 的 dict 對象 中;局部名字空間存儲在一個叫 locals() 的 dict 對象中。
我們可以用 print (locals()) 來查看該函數體內的所有變量名和變量值。

下面簡單演示一下 eval()函數的使用:

#!usr/bin/env python #encoding:utf-8import mathdef 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]

a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]" b = eval(a) b Out[3]: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]type(b) Out[4]: lista = "{1: 'a', 2: 'b'}" b = eval(a) b Out[7]: {1: 'a', 2: 'b'}type(b) Out[8]: dicta = "([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)

# 字符串轉換成字典
a = "{1: 'a', 2: 'b'}"
print(type(a))
b = eval(a)
print(type(b))
print(b)

# 字符串轉換成元組
a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
print(type(a))
b=eval(a)
print(type(b))
print(b)

上面簡單演示的是eval在字符串對象和list、dictinoary、tuple對象之間的轉換作用。

不可謂不強大!

BUT!強大的函數有代價。安全性是其最大的缺點。

想一想這種使用環境:需要用戶輸入一個表達式,并求值。

如果用戶惡意輸入,例如:__import__('os').system('dir')
那么 eval() 之后,你會發現,當前目錄文件都會展現在用戶前面。

eval(__import__('os').system('dir'))

?

那么繼續輸入:open('文件名').read()
代碼都給人看了。獲取完畢,一條刪除命令,文件消失。哭吧!

?

眾所周知:

eval()的確是一個很便捷的工具,但是便捷使用不當的同時也會造成嚴重的安全問題,不少的文章和博客都對eval()的安全性進行了相關的分析,在這里我就不多說了。

怎么避免安全問題?
1、自行寫檢查函數;
2、使用 ast.literal_eval:自行查看DOCUMENT:https://docs.python.org/2/library/ast.html
3、更多好文:Restricted "safe" eval(Python recipe):http://code.activestate.com/recipes/496746-restricted-safe-/

?

?

總結

以上是生活随笔為你收集整理的python3 中的 eval 函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。