有些时候可能会需要动态地创造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语句并不常用,但是它们可以作为“后兜里的得力工具”。
时间: 2024-11-11 13:09:28