函数exec与eval都可以将字符串作为代码执行
(1)eval(expression[, globals[, locals]])
expression实参是一个字符串,以及可选的 globals 和 locals。globals 实参必须是一个字典。locals 可以是任何映射对象。
代码示例1:
a = eval("1+2")
print(a)
#3
b = eval("x+y",{"x":1,"y":2})
print(b)
#3
c = eval("sqrt(4)")
print(c)
#2.0
d = '{"x":1,"y":2}'
print(eval(d))
#{"x":1,"y":2}
可以看出用eval会执行表达式,并返回一个结果
(2)exec(object[, globals[, locals]])
这个函数支持动态执行 Python 代码。object 必须是字符串或者代码对象。如果是字符串,其会解析为python语句执行,如果是一个对象,将会被直接执行
代码示例2:
a = exec("1+2")
print(a)
#None
exec("x = 1 + 2")
print(x)
#3
exec不会返回任何值,只会执行其中的语句
但在执行exec时,可能会造成命名空间的冲突,此时就需要将其传递一个命名空间。
代码示例3:
exec("str = 1")
print(str([1,2,3]))
此时将会报错
TypeError: ‘int’ object is not callable
下面是修改代码,用字典作为代码块的命名空间
scope = {}
exec("str = 1",scope)
print(str([1,2,3]))
#[1,2,3]
print(scope["str"])
#1
print(scope.keys())
#dict_keys(['__builtins__', 'str'])
这样代码就不会污染原有的命名空间