码迷,mamicode.com
首页 > 编程语言 > 详细

Python函数-eval()

时间:2017-05-21 11:43:53      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:元组   strong   list   对象   应用   blog   执行   div   使用   

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

Python函数-eval()

标签:元组   strong   list   对象   应用   blog   执行   div   使用   

原文地址:http://www.cnblogs.com/guyuyuan/p/6884115.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!