有些時候可能會需要動態地創造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語句並不常用,但是它們可以作為“后兜里的得力工具”。