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

上一篇:

下一篇:

相关推荐

网站地图|XML地图

Copyright © 2015-2024 技术拉近你我! All rights reserved.
闽ICP备15015576号-1 版权所有©psz.