eval(str [,globals [,locals ]])函數(shù)將字符串str當(dāng)成有效Python表達(dá)式來求值,并返回計算結(jié)果。
同樣地, exec語句將字符串str當(dāng)成有效Python代碼來執(zhí)行.提供給exec的代碼的名稱空間和exec語句的名稱空間相同.
最后,execfile(filename [,globals [,locals ]])函數(shù)可以用來執(zhí)行一個文件,看下面的例子:
>>> eval('3+4')
7
>>> exec 'a=100'
>>> a
100
>>> execfile(r'c:\test.py')
hello,world!
>>>
默認(rèn)的,eval(),exec,execfile()所運行的代碼都位于當(dāng)前的名字空間中. eval(), exec,和 execfile()函數(shù)也可以接受一個或兩個可選字典參數(shù)作為代碼執(zhí)行的全局名字空間和局部名字空間. 例如:
1 globals = {'x': 7,
2 'y': 10,
3 'birds': ['Parrot', 'Swallow', 'Albatross']
4 }
5 locals = { }
6
7 # 將上邊的字典作為全局和局部名稱空間
8 a = eval("3*x + 4*y", globals, locals)
9 exec "for b in birds: print b" in globals, locals # 注意這里的語法
10 execfile("foo.py", globals, locals)
如果你省略了一個或者兩個名稱空間參數(shù),那么當(dāng)前的全局和局部名稱空間就被使用.如果一個函數(shù)體內(nèi)嵌嵌套函數(shù)或lambda匿名函數(shù)時,同時又在函數(shù)主體中使用exec或execfile()函數(shù)時, 由于牽到嵌套作用域,會引發(fā)一個SyntaxError異常.(此段原文:If you omit one or both namespaces, the current values of the global and local namespaces are used. Also,due to issues related to nested scopes, the use of exec or execfile() inside a function body may result in a SyntaxError exception if that function also contains nested function definitions or uses the lambda operator.)
在Python2.4中俺未發(fā)現(xiàn)可以引起異常
注意例子中exec語句的用法和eval(), execfile()是不一樣的. exec是一個語句(就象print或while), 而eval()和execfile()則是內(nèi)建函數(shù).
exec(str) 這種形式也被接受,但是它沒有返回值。
當(dāng)一個字符串被exec,eval(),或execfile()執(zhí)行時,解釋器會先將它們編譯為字節(jié)代碼,然后再執(zhí)行.這個過程比較耗時,所以如果需要對某段代碼執(zhí)行很多次時,最好還是對該代碼先進(jìn)行預(yù)編譯,這樣就不需要每次都編譯一遍代碼,可以有效提高程序的執(zhí)行效率。
compile(str ,filename ,kind )函數(shù)將一個字符串編譯為字節(jié)代碼, str是將要被編譯的字符串, filename是定義該字符串變量的文件,kind參數(shù)指定了代碼被編譯的類型-- 'single'指單個語句, 'exec'指多個語句, 'eval'指一個表達(dá)式. cmpile()函數(shù)返回一個代碼對象,該對象當(dāng)然也可以被傳遞給eval()函數(shù)和exec語句來執(zhí)行,例如:
1 str = "for i in range(0,10): print i"
2 c = compile(str,'','exec') # 編譯為字節(jié)代碼對象
3 exec c # 執(zhí)行
4
5 str2 = "3*x + 4*y"
6 c2 = compile(str2, '', 'eval') # 編譯為表達(dá)