Python可执行对象——exec、eval、compile
Python提供的调用可执行对象的内建函数进行说明,涉及exec、eval、compile三个函数。exec语句用来执行存储在代码对象、字符串、文件中的Python语句,eval语句用来计算存储在代码对象或字符串中的有效的Python表达式,而compile语句则提供了字节编码的预编译。
exec的使用
eval的使用
本函数是用来动态地执行一个表达式的字符串,或者compile函数编译出来的代码对象。参数expression是一个表达式字符串,或者表示编译出来代码对象的名称;参数globals是全局命名空间,可以指定执行表达式时的全局作用域的范围,比如指定某些模块可以使用。如果本参数缺省,就使用当前调用这个函数的当前全局命名空间;参数locals是局部作用域命名空间,是用来指定执行表达式时访问的局部命名空间。如果全局命名空间参数出现,但缺省内置模块,那么会自动拷贝这个模块到全局命名空间,意味着无论怎么设置,都可以使用内置模块。如果两个命名空间,都使用缺省方式,就会使用调用这个函数时的命名空间来查找相应的变量。
为什么要使用这个函数呢?这个函数的原因,应该就是动态语言与编译语言的差别之处,因为在编译语言里要动态地产生代码,基本上是不可能的,但动态语言是可以,意味着软件已经部署到服务器上了,但只要作很少的更改,只好直接修改这部分的代码,就可立即实现变化,不用整个软件重新加载。另外一个,这个功能可以用来机器学习里,比如根据用户使用这个软件频率,以及方式,可动态地修改代码,适应用户的变化。想到这里,是不是具有生命力的能力,可以自我更新代码,实现改良式进步,如果做破坏性的动作,其实就是一个病毒。使用exec和eval一定要注意安全性问题,尤其是网络环境中,可能给予他人执行非法语句的机会。
eval就是python作为动态语言的一个特点。可用作以下用途;
(1) 动态构造参数
opts=struct.uppack(eval("b'%ds'"%(opts_len)),ip_header[20:])
(2)从外部字符串中生成python对象
要想更安全的使用 eval , 参考:
http://code.activestate.com/recipes/496746-restricted-safe-/
http://stackoverflow.com/questions/15197673/using-pythons-eval-vs-ast-literal-eval
compile的使用
格式:compile( str, file, type )
compile语句是从type类型(包括’eval’: 配合eval使用,’single’: 配合单一语句的exec使用,’exec’: 配合多语句的exec使用)中将str里面的语句创建成代码对象。file是代码存放的地方,通常为”。
compile语句的目的是提供一次性的字节码编译,就不用在以后的每次调用中重新进行编译了。
还需要注意的是,这里的compile和正则表达式中使用的compile并不相同,尽管用途一样。
>>> eval_code = compile( '1+2', '', 'eval')
>>> eval_code
<code object <module> at 0142ABF0, file "", line 1>
>>> eval(eval_code)
3 >>> single_code = compile( 'print "pythoner.com"', '', 'single' )
>>> single_code
<code object <module> at 01C68848, file "", line 1>
>>> exec(single_code)
pythoner.com >>> exec_code = compile( """for i in range(5):
... print "iter time: %d" % i""", '', 'exec' )
>>> exec_code
<code object <module> at 01C68968, file "", line 1>
>>> exec(exec_code)
iter time: 0
iter time: 1
iter time: 2
iter time: 3
iter time: 4
Python可执行对象——exec、eval、compile的更多相关文章
- Python可执行对象——exec、eval、compile
Python提供的调用可执行对象的内建函数进行说明,涉及exec.eval.compile三个函数.exec语句用来执行存储在代码对象.字符串.文件中的Python语句,eval语句用来计算存储在代码 ...
- Python 可执行对象
Python 可执行对象 eval/repr eval eval 可以执行字符串类型的表达式 (或 compile() 创建的代码对象(code object) ) 并返回执行结果 eval(expr ...
- python 内置函数eval()、exec()、compile()
eval 函数的作用: 计算指定表达式的值.也就是说它要执行的python代码只能是单个表达式,而不是复杂的代码逻辑. eval(source, globals=None, locals=Non ...
- 2015/10/9 Python基础(21):可调用和可执行对象
在Python中有多种运行外部程序的方法,比如,运行操作系统命令或另外的Python脚本,或执行一个磁盘上的文件,或通过网络来运行文件.这完全取决于想要干什么.特定的环境包括: 在当前脚本继续运行 创 ...
- eval 与 exec, compile区别
exec 不是表达式: python 2. x, 中的一个语句和 python 3. x. 中的一个函数它编译并立即计算一个字符串中包含的语句或者语句集. 例如: exec('print(5)') # ...
- 内置函数— — eval、exec、compile
字符串类型代码:eval.exec.compile eval() 执⾏字符串类型的代码,并返回最终结果 print(eval("2+2")) # 4 n=8 def func() ...
- 第6.3节 Python动态执行之动态编译的compile函数
Python支持动态代码主要三个函数,分别是compile.eval和exec.本节介绍compile函数的语法和相关使用.compile函数用来编译一段字符串的源码,将其编译为字节码或者AST(抽像 ...
- 内置函数——eval、exec、compile
内置函数——eval.exec.compile eval() 将字符串类型的代码执行并返回结果 print(eval('1+2+3+4')) exec()将自字符串类型的代码执行 print(exec ...
- 内置函数---eval、exec、compile
eval() 将字符串类型的代码执行并返回结果 print(eval('1+2+3+4')) exec()将自字符串类型的代码执行 print(exec("1+2+3+4")) e ...
随机推荐
- NTP路由器配置
14.1. 路由器日志显示时间戳 提问 在路由器 的日志和排错信息里面显示时间 回答 Router#configure terminal Enter configuration commands, o ...
- jekyll简单使用
jekyll build # => 当前文件夹中的内容将会生成到 ./site 文件夹中. jekyll build –destination <destination> # =&g ...
- csu 1803(余数分类)
1803: 2016 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 565 Solved: 364[Submit][Status][Web Board ...
- JAVA邻接矩阵实现拓扑排序
由于一直不适用邻接表 ,现在先贴一段使用邻接矩阵实现图的拓扑排序以及判断有无回路的问题.自己做的图.将就看吧. package TopSort; import java.util.LinkedList ...
- 关于Android不同系统版本的市场占比情况详解
一,google官方统计的不同Android版本市场的占比强开 google统计的数据情况 这个是google官方对于不同版本的市场占比情况.这个是针对全世界所有的Android手机占比情况. 二,友 ...
- numpy基础代码操练
In [20]: b[0,:,1] Out[20]: array([1, 5, 9]) In [21]: b[0,:,1] Out[21]: array([1, 5, 9]) In [22]: b[0 ...
- Python写网络爬虫爬取腾讯新闻内容
最近学了一段时间的Python,想写个爬虫,去网上找了找,然后参考了一下自己写了一个爬取给定页面的爬虫. Python的第三方库特别强大,提供了两个比较强大的库,一个requests, 另外一个Bea ...
- 实现优先级队列 --heapq模块
以给定的优先级对元素进行排序,每次pop删除优先级最高的 # coding=utf-8 # example.py # # Example of a priority queue import heap ...
- 【LOJ】#2012. 「SCOI2016」背单词
题解 我们发现第一种操作肯定不可取,每个节点里它最近的点是它最长出现过的后缀,发现这就是AC自动机的fail节点,根据fail的关系这会是一棵树,而一个单词的前一个序号最大的后缀必定是它的父亲 然后我 ...
- ScrureCRT访问CentOS时出现乱码的解决办法
1. ScrureCRT访问CentOS时,出现乱码. 登陆后,输入日历命令:cal 输出日历带有乱码的结果: 2. 查看当前系统的语言. 输入命令:echo $LANG 输出:zh_CN.UTF ...