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