From:http://blog.csdn.net/zhanh1218/article/details/37562167

Python:eval的妙用和滥用:https://blog.csdn.net/zhanh1218/article/details/37562167
python eval():http://www.cnblogs.com/dadadechengzi/p/6149930.html
Python eval 函数妙用:http://www.cnblogs.com/liu-shuai/p/6098246.html
Python 中 eval 带来的潜在风险:https://blog.csdn.net/u011721501/article/details/47298723
Python之 eval() 函数危险性浅析:https://www.jb51.net/article/51814.htm

eval() 函数十分强大,官方文档解释是:将字符串 string 对象 转化为有效的表达式参与求值运算返回计算结果
语法上:调用的是:eval(expression,globals=None, locals=None)返回的是计算结果
so,结合 math 当成一个计算器很好用。
可以把 list、tuple、dict 和 string 相互转化

其中:
        expression 是一个参与计算的 python 表达式
        globals 是可选的参数,如果设置属性不为 None 的话,就必须是 dictionary 对象了
        locals 也是一个可选的对象,如果设置属性不为 None 的话,可以是任何 map 对象了

python 是用命名空间来记录变量的轨迹的,命名空间是一个dictionary,键是变量名,值是变量值。

当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:

  • 1)局部名字空间 - 特指当前函数或类的方法。
          如果函数定义了一个局部变量 x, 或一个参数 x,Python 将使用它,然后停止搜索。
  • 2)全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。
  • 3)内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。

python 的全局名字空间存储在一个叫 globals() 的 dict 对象 中;局部名字空间存储在一个叫 locals() 的 dict 对象中。
我们可以用 print (locals()) 来查看该函数体内的所有变量名和变量值。

下面简单演示一下 eval()函数的使用:

#!usr/bin/env python
#encoding:utf-8import mathdef eval_test():l='[1,2,3,4,[5,6,7,8,9]]'d="{'a':123,'b':456,'c':789}"t='([1,3,5],[5,6,7,8,9],[123,456,789])'print '--------------------------转化开始--------------------------------'print type(l), type(eval(l))print type(d), type(eval(d))print type(t), type(eval(t))if __name__=="__main__":eval_test()

运行结果为:

--------------------------转化开始--------------------------------
<type 'str'> <type 'list'>
<type 'str'> <type 'dict'>
<type 'str'> <type 'tuple'>
[Finished in 0.2s]

a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
b = eval(a)
b
Out[3]: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]type(b)
Out[4]: lista = "{1: 'a', 2: 'b'}"
b = eval(a)
b
Out[7]: {1: 'a', 2: 'b'}type(b)
Out[8]: dicta = "([1,2], [3,4], [5,6], [7,8], (9,0))"
b = eval(a)b
Out[11]: ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))

eval 函数就是实现list、dict、tuple与 str 之间的转化
str 函数把 list,dict,tuple 转为为 字符串
# 字符串转换成列表
a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
print(type(a))
b = eval(a)
print(b)

# 字符串转换成字典
a = "{1: 'a', 2: 'b'}"
print(type(a))
b = eval(a)
print(type(b))
print(b)

# 字符串转换成元组
a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
print(type(a))
b=eval(a)
print(type(b))
print(b)

上面简单演示的是eval在字符串对象和list、dictinoary、tuple对象之间的转换作用。

不可谓不强大!

BUT!强大的函数有代价。安全性是其最大的缺点。

想一想这种使用环境:需要用户输入一个表达式,并求值。

如果用户恶意输入,例如:__import__('os').system('dir')
那么 eval() 之后,你会发现,当前目录文件都会展现在用户前面。

eval(__import__('os').system('dir'))

那么继续输入:open('文件名').read()
代码都给人看了。获取完毕,一条删除命令,文件消失。哭吧!

众所周知:

eval()的确是一个很便捷的工具,但是便捷使用不当的同时也会造成严重的安全问题,不少的文章和博客都对eval()的安全性进行了相关的分析,在这里我就不多说了。

怎么避免安全问题?
1、自行写检查函数;
2、使用 ast.literal_eval:自行查看DOCUMENT:https://docs.python.org/2/library/ast.html
3、更多好文:Restricted "safe" eval(Python recipe):http://code.activestate.com/recipes/496746-restricted-safe-/

python3 中的 eval 函数相关推荐

  1. python3中的 eval函数

    http://blog.csdn.net/zhanh1218/article/details/37562167 原文 eval()函数十分强大,官方demo解释为:将字符串str当成有效的表达式来求值 ...

  2. python3中input输入浅谈_详解Python3中的 input() 函数

    详解Python3中的 input() 函数 一.知识介绍: 1.input() 函数,接收任意输入,将所有输入默认为字符串处理,并返回字符串类型: 2.可以用作文本输入,如用户名,密码框的值输入: ...

  3. 深入认识javascript中的eval函数

    来源:http://wanyij.blog.51cto.com/46570/43794 发现为本文起一个合适的标题还不是那么容易,呵呵,所以在此先说明下本文的两个目的: (1)介绍javascript ...

  4. python input函数详解_对Python3中的input函数详解

    下面介绍python3中的input函数及其在python2及pyhton3中的不同. python3中的ininput函数,首先利用help(input)函数查看函数信息: 以上信息说明input函 ...

  5. python3中调用map函数报错map object at 0x000001EF004D97B8

    python3中调用map函数报错<map object at 0x000001EF004D97B8> 在python中这样的一段代码报错: a=map(int,input().split ...

  6. Python3中的round函数(四舍六入五成偶)

    在python3中,round函数并不是简单地四舍五入,而是四舍六入五成偶 如:round(1.5)= 2 , round(2.5)=2. 四舍六入五成偶具体分为两点(): 1.若被约的5后面还有数字 ...

  7. 关于js中的eval函数

    关于JS中的eval()函数 eval()函数的定义和用法 JavaScript中的 eval() 函数可以计算eval中的参数(JavaScript 字符串),并把它作为脚本代码来执行.       ...

  8. Python3中内置函数callable介绍

          Python3中的内置函数callable接受一个对象参数,如果此对象参数看起来可调用,则callable函数返回True,否则返回False.如果返回True,则调用仍有可能失败:但如果 ...

  9. 在python3中print作为函数存在_Python3中的print函数

    Python3中的输出语句: 函数原型如下: print(help(print)) 使用此语句打印 print(...) print(value, ..., sep=' ', end='\n', fi ...

最新文章

  1. python重复元素判定_Python实现判断给定列表是否有重复元素的方法
  2. 关于实现无限循环的做法
  3. recv返回值为0_基于GNES和Tensorflow 2.0的大规模视频语义搜索
  4. java properties读取缓存_Java读取Properties文件
  5. aspose转pdf横版_aspose实现Office转Pdf
  6. 一.因子图优化学习---董靖博士在深蓝学院的公开课学习(1)
  7. LKCOS:基于程序移植的COS系统
  8. 面向对象-day02
  9. Android 手动解析JSON数据
  10. zabbix详解(十一)——zabbix监控MySQL性能实战
  11. 3.3通过EmbeddedServletContainerCustomizer调用Tomcat
  12. php 5.4中php-fpm 的重启、终止操作命令
  13. 21天自学c语言漫画版,21天学通C语言第6版
  14. 50句哲理 语录(二)
  15. 计算机应用程序无响应,电脑上应用程序很容易未响应,怎么办?
  16. 卫星历史影像数据—六种查看方法
  17. 隧道放样方法+超欠挖计算方法+程序
  18. Python数据分析——世界自杀概况分析
  19. 04 - Linux的用户与组文件
  20. python中多分支结构可以不用else吗_Python3基础 多分支结构 if-elif-else

热门文章

  1. 纠删码存储系统中的投机性部分写技术
  2. 深度学习在文本领域的应用
  3. 论文浅尝 | 从具有数值边缘属性的知识图谱中学习嵌入
  4. Android官方开发文档Training系列课程中文版:Activity测试之创建运行测试
  5. 【JavaWeb】数据库基础复习
  6. Lucene 全文搜索解析
  7. Java基础:数组的声明,循环,赋值,拷贝。
  8. 消息队列---消息模型及使用场景
  9. 虚拟机的ip地址为什么会发生变化
  10. jacascript AJAX 学习