python常識系列19-->eval()函數使用


前言

   把現在的工作做好,才能幻想將來的事情,專注於眼前的事情,對於尚未發生的事情而陷入無休止的憂慮之中,對事情毫無幫助,反而為自己憑添了煩惱。

一、eval()函數是什么?

  • Python的一個內置函數;
  • 返回傳入字符串的表達式結果(官方)

二、eval()函數語法解析

eval(expression[, globals[, locals]])

# expression : 表達式。
# globals : 變量作用域,全局命名空間,如果被提供,則必須是一個字典對象。
# locals : 變量作用域,局部命名空間,如果被提供,可以是任何映射對象。

三、eval()函數應用舉例

3.1 eval()基本應用舉例

print(eval('66+72')) # 把字符串解析成66+72的結果
print( eval("{'name':'linux','age':18}") ) # 把字符串轉為字典
print( eval("[[1,2], [3,4], [5,6], [7,8], [9,0]]") ) # 把字符串轉為列表
print(eval("{'name':'linux','age':age}",{"age":18})) # 傳遞globals參數值為{“age”:18}

age=18
print(eval("{'name':'linux','age':age}",{"age":20},locals())) # 傳遞locals參數

上述例子中,展示了eval()的3個應用:

  • 把字符串轉化為代碼表達式求結果,如 66+72
  • 把字符串轉化為其它數據類型,如字典、列表、元組、集合等
  • 傳遞globals參數和locals參數,當兩個參數都存在時,先查找locals參數,再查找globals參數,locals參數中同名變量會覆蓋globals中的變量

3.2 eval()危害舉例

str1 = "__import__('os').system('rm -rf ./a.txt')"  # 刪除當前目錄下的a.txt文件
eval( str1 )
str2 = "__import__('os').system('ls')" # 顯示當前代碼路徑下的所有代碼文件名稱
eval( str2 )

上述例子中,eval()將字符串轉成表達式並執行,就可以利用其執行系統命令,刪除文件等操作。

3.3 ast.literal_eval()替代eval()實現數據類型轉換

import ast

print( ast.literal_eval("{'name':'linux','age':18}") )
print( ast.literal_eval("[[1,2], [3,4], [5,6], [7,8], [9,0]]") )

上述代碼也能完成類型轉換,但由於沒有使用eval(),所以產生的安全風險較小。
literal_eval() 函數:會判斷需要計算的內容計算后是不是合法的python類型,如果是則進行運算,否則就不進行運算。


免責聲明!

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



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