Python学习总结17:exec和eval执行求值字符串

时间:2023-03-09 08:32:28
Python学习总结17:exec和eval执行求值字符串

有些时候可能会需要动态地创造Python代码,然后将其作为语句执行或作为表达式计算。

1. exec

>>>exec "print 'Hello, world!'"
Hello, world!
>>>from math import sqrt
>>>exec "sqrt=i"
>>>sqrt(4)
Traceback (most recent call,ast):
File "<pyshell#18>", line 1. in ?
sqrt(4)
TypeError: object is not callable: 1

上面第二个例子,存在干扰已有函数的情况,这时需要使用命名空间(或作用域),解决该种问题;(或命名与已有函数名不一致)

from math import sqrt
>>> scope = {}
>>> exec 'sqrt = 1' in scope
>>> sqrt(4)
2.0
>>> scope['sqrt']

2. eval

eval(用于“求值”)是类似于exec的内建函数。exec语句会执行一系列Pthon语句,而eval会计算Python表达式(以字符串形式书写),并且返回结果值,(exec语句并不返回任何对象,因为它本身就是语句)。例如,可以使用下面的代码创建一个Python计算器:

>>> eval(raw_input("Enter an arithmetic expression: ”))
Enter an arithmetic expressipn: 6+18 * 2
42

跟exec一样,eval也可以使用命名空间。尽管表达式几乎不像语句那样为变量重新赋值(事实上,可以给eval语句提供两个命名空间,一个全局的一个局部的。全局的必须是字典,局部的可以是任何形式的映射)。

>>> scope = {}
>>> scope['x'] = 2
>>> scope['y'] = 3
>>>eval('x * y', scope)
6

事实上, exec语句和eval语句并不常用,但是它们可以作为“后兜里的得力工具”。