字符串作为代码执行的方法:
1、eval()
构造器:eval(source, globals=None, locals=None, /)
说明:输入一个【python表达式或code对象】参与计算。
用于恶意攻击,窥视:
再看下eval的参数globals和locals参数的用法,看栗子:
一幕了然,局部变量空间和全局变量空间的优先级的先后顺序~
2、exec
首先看下,exec和eval的区别
查阅官方doc:
细微差别:
eval:
(1)只能是一个表达式【也就是一行语句】字符串!
(2)可以计算, 也可以返回计算结果【也就是说表达式的结果就是eval的返回值】,不对代码做evaluate,即不产生新的变量等。
exec:
(1)指定一个包含一个多行语句的字符串对象。
(2)可以产生新的变量,但没有返回值(也就是None)。【需要区分函数的返回值和代码执行过程中的输出悉尼】
3、动态创建变量
(1)locals():字典类型,存放本地变量的命令空间
(2)exec()可以产生新的变量,eval()不行。
4、compile()
eval和exec的doc中都会提到compile,那么compile()到底怎么使用呢?
看doc可知:compile()将源码转为code对象,然后再传入给eval或者exec执行。
总结:
(1)compile()作用就是预包装code为一个对象,然后作为eval和exec的参数,同时支持很多其他功能,比如控制code的输出信息等等。
(2)compile重点参数在于mode,本质上和eva和exec一样!(使用exec模式,可以包装多行代码,而且eval()和exec()都可以执行,但是使用eval模型,则只能包装表达式!)
--- over --