Python函數-eval()


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

作用:

       將字符串str當成有效的表達式來求值並返回計算結果。參數:source:一個Python表達式或函數compile()返回的代碼對象;globals:可選。必須是dictionary;locals:可選。任意map對象。

實例:

 1 #################################################
 2 字符串轉換成列表
 3 >>>a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
 4 >>>type(a)
 5 <type 'str'>
 6 >>> b = eval(a)
 7 >>> print b
 8 [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
 9 >>> type(b)
10 <type 'list'>
11 #################################################
12 字符串轉換成字典
13 >>> a = "{1: 'a', 2: 'b'}"
14 >>> type(a)
15 <type 'str'>
16 >>> b = eval(a)
17 >>> print b
18 {1: 'a', 2: 'b'}
19 >>> type(b)
20 <type 'dict'>
21 #################################################
22 字符串轉換成元組
23 >>> a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
24 >>> type(a)
25 <type 'str'>
26 >>> b = eval(a)
27 >>> print b
28 ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
29 >>> type(b)
30 <type 'tuple'>
 1 #test eval() and locals()
 2 x = 1
 3 y = 1
 4 num1 = eval("x+y")
 5 print (num1)
 6 
 7 def g():    
 8     x = 2    
 9     y = 2  
10     num3 = eval("x+y")    
11     print (num3)        
12     num2 = eval("x+y",globals())   
13     #num2 = eval("x+y",globals(),locals())    
14     print (num2)
15     
16 g()
17 
18 print locals()["x"]
19 print locals()["y"] 
20 print globals()["x"]
21 print globals()["y"]

num1的值是2;num3的值也很好理解,是4;num2的值呢?由於提供了globals()參數,那么首先應當找全局的x和y值,也就是都為1,那么顯而易見,num2的值也是2。如果注釋掉該句,執行下面一句呢?根據第3)點可知,結果為4

eval()使用原因:

     1)在編譯語言里要動態地產生代碼,基本上是不可能的,但動態語言是可以,意味着軟件已經部署到服務器上了,但只要作很少的更改,只好直接修改這部分的代碼,就可立即實現變化,不用整個軟件重新加載。

     2)在machin learning里根據用戶使用這個軟件頻率,以及方式,可動態地修改代碼,適應用戶的變化。

注:

     eval有安全性問題,比如用戶惡意輸入就會獲得當前目錄文件

1 eval("__import__('os').system('dir')")
1 >>> import os
2 >>> 'os' in globals()
3 True
4 >>> os.system('whoami')
5 ap\zhail

怎么避免安全問題?

1、自行寫檢查函數;

2、使用ast.literal_eval


免責聲明!

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



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