>> A="{'..._求字典里value值的和">
当前位置:   article > 正文

字符串中的字典取出value值(eval 使用及介绍)_求字典里value值的和

求字典里value值的和

eval:eval() 函数用来执行一个字符串表达式,并返回表达式的原始值。

例如:有个字符串 A="{'value': 'hello'}"

想要输出该字符串的value值,应该怎么办。

如果仅仅是一个字典的话直接取dict['key']就可以轻松取出来,但是在字符串中我们就必须想办法把字符串转化成字典。这时候eval函数就该闪亮登场了。

代码如下:

>>> A="{'value': 'hello'}"
>>> B=eval(A)
>>> B
{'value': 'hello'}

此时在字典情况下想取出值就轻而易举了!

>>> B['value']

Python eval 函数妙用

eval

  功能:将字符串str当成有效的表达式来求值并返回计算结果。

  语法: eval(source[, globals[, locals]]) -> value

  参数:

    source:一个Python表达式或函数compile()返回的代码对象

    globals:可选。必须是dictionary

    locals:可选。任意map对象

  实例展示:

  1. 可以把list,tuple,dict和string相互转化。
  2. #################################################
  3. 字符串转换成列表
  4. >>>a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
  5. >>>type(a)
  6. <type 'str'>
  7. >>> b = eval(a)
  8. >>> print b
  9. [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
  10. >>> type(b)
  11. <type 'list'>
  12. #################################################
  13. 字符串转换成字典
  14. >>> a = "{1: 'a', 2: 'b'}"
  15. >>> type(a)
  16. <type 'str'>
  17. >>> b = eval(a)
  18. >>> print b
  19. {1: 'a', 2: 'b'}
  20. >>> type(b)
  21. <type 'dict'>
  22. #################################################
  23. 字符串转换成元组
  24. >>> a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
  25. >>> type(a)
  26. <type 'str'>
  27. >>> b = eval(a)
  28. >>> print b
  29. ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
  30. >>> type(b)
  31. <type 'tuple'>

eval()使用原因:

1)在编译语言里要动态地产生代码,基本上是不可能的,但动态语言是可以,意味着软件已经部署到服务器上了,但只要作很少的更改,只好直接修改这部分的代码,就可立即实现变化,不用整个软件重新加载。

2)在machin learning里根据用户使用这个软件频率,以及方式,可动态地修改代码,适应用户的变化。

 

example:

  1. a=1
  2. g={'a':20}
  3. eval("a+1",g)

返回21

  1. #test eval() and locals()
  2. x = 1
  3. y = 1
  4. num1 = eval("x+y")
  5. print (num1)
  6. def g():
  7. x = 2
  8. y = 2
  9. num3 = eval("x+y")
  10. print (num3)
  11. num2 = eval("x+y",globals())
  12. #num2 = eval("x+y",globals(),locals())
  13. print (num2)
  14. g()
  15. print locals()["x"]
  16. print locals()["y"]
  17. print globals()["x"]
  18. print globals()["y"]
 

num1的值是2;num3的值也很好理解,是4;num2的值呢?由于提供了globals()参数,那么首先应当找全局的x和y值,也就是都为1,那么显而易见,num2的值也是2。如果注释掉该句,执行下面一句呢?根据第3)点可知,结果为4

 

locals()对象的值不能修改,globals()对象的值可以修改

  1. #test globals() and locals()
  2. z=0
  3. def f():
  4. z = 1
  5. print (locals())
  6. locals()["z"] = 2
  7. print (locals())
  8. f()
  9. globals()["z"] = 2
  10. print (z)

可以得出,两个print (locals())的结果是一样的,说明没有修改成功。而print (z)的值是2,说明修改成功了

 

eval有安全性问题,比如用户恶意输入就会获得当前目录文件

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

 

怎么避免安全问题?

1、自行写检查函数;

2、使用ast.literal_eval

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/215269
推荐阅读
相关标签
  

闽ICP备14008679号