zoukankan      html  css  js  c++  java
  • python3---函数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())    ##如果 globals() 和 locals()同时出现 两者有交叉部分的时候,则后者会覆盖掉前者的作用,也就是使用后者环境中的变量 ,参考:http://lib.csdn.net/article/python/62300?knid=165 具体理解
    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有安全性问题,比如用户恶意输入就会获得当前目录文件

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

    怎么避免安全问题?

    1、自行写检查函数;

    2、使用ast.literal_eva

    转自:https://www.cnblogs.com/guyuyuan/p/6884115.html

  • 相关阅读:
    使用非root用户在RedHat 4下安装XHProf
    使用ClippingNode对精灵进行遮罩处理
    令Code::Blocks支持C++11特性
    解决cocos2dx在VS2012中文版环境下不支持中文的问题
    bzoj 1045[HAOI2008] 糖果传递
    bzoj 1070[SCOI2007]修车
    bzoj [ZJOI2010]网络扩容
    bzoj 1089[SCOI2003]严格n元树
    bzoj 4566[Haoi2016]找相同字符
    bzoj 1085[SCOI2005]骑士精神
  • 原文地址:https://www.cnblogs.com/loved/p/8697643.html
Copyright © 2011-2022 走看看