5.5Python下exec和eval的使用
Posted by 撒得一地 on 2016年4月5日 in python教程
有些时候可能会需要动态地创造Python代码,然后将其作为语句执行或作为表达式计算。下面详细介绍如何执行存储在字符串中的代码。
exec语法
exec(str)
其中:str可以是:
代码字符串 文件对象 代码对象 tuple
注意:python2时exec 是一个语法声明,不是一个函数。也就是说和if,for一样。但在Python3.0中,exec是一个函数而不是语句。
使用exec执行一个字符串:
>>> exec('print("Hello,world!")') Hello,world! >>> a = 2 >>> exec("a=1") >>> a 1
但是,比如下面这个例子就会报错:
>>> from math import sqrt >>> exec("sqrt = 1") >>> sqrt(4) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'int' object is not callable
上面例子报错是因为变量名和内建函数名相互干扰了,所以,为了安全起见,可以增加一个字典,起到命名空间的作用。命名空间,可以浅显的理解为放置变量的地方。可以用字典起到放置代码字符串命名空间的作用。实例:
>>> a = 2 >>> b = 3 >>> g = {"a":6,"b":3} >>> a 2 >>> g['a'] 6 >>> from math import sqrt >>> d = {"sqrt":1} >>> sqrt(4) 2.0 >>> d['sqrt'] 1
exec还可以带多个参数,比如:
exec(expr, globals) 其中globals必须是字典
通过带两个参数的形式也可以解决命名冲突,实例:
>>> from math import sqrt >>> ff = {} >>> exec("sqrt=1",ff) >>> sqrt(4) 2.0 >>> ff['sqrt'] 1
eval 语法
eval(expression[, globals[, locals]])
eval会计算Python表达式(以字符串形式书写),并返回结果。
有三个参数,表达式字符串,globals变量作用域,locals变量作用域。 其中第二个和第三个参数是可选的。
如果忽略后面两个参数,则eval在当前作用域执行。
不带参数实例,执行操作,并返回结果:
>>> a= 1 >>> eval("a+1") 2
如果指定globals参数
>>> f = 1 >>> dict = {"f":10} >>> eval("f+1",dict) 11 >>> f 1 >>> dict['f'] 10
如果指定locals参数
>>> a=10 >>> b=10 >>> c=20 >>> g={"a":6,"b":8} >>> l={"b":9,"c":10} >>> eval("a+b+c",g,l) 25 >>> a 10 >>> b 10 >>> c 20