exec()函數用於動態執行Python程序,該程序可以是字符串或目標代碼。如果是字符串,則將字符串解析為一組Python語句,然後執行該語句,除非發生語法錯誤,並且如果它是目標代碼,則隻需執行即可。我們必須小心,即使在傳遞給exec()函數的代碼上下文中,也不能在函數定義之外使用return語句。它不返回任何值,因此返回None。用法:
exec(object[, globals[, locals]])
它可以包含三個參數:
- object: 如前所述,這可以是字符串或目標代碼
- globals: 這可以是字典,參數是可選的
- locals: 這可以是一個映射對象,也是可選的
現在,讓我們看看該函數的工作原理。在以下代碼中,我們使用了目標代碼,並使用exec()函數執行了該代碼。我們隻是采用了object參數,而省略了其他兩個字段。
例:
prog = 'print("The sum of 5 and 10 is", (5+10))'
exec(prog)
輸出:
5和10的總和是15
Warning or Limitations
在使用exec()函數內部的任何方法之前,必須牢記exec()支持的所有函數。要查看此內容,我們可以使用dir()函數。
例:
# The math class is used to include all the
# math functions
from math import *
exec("print(dir())")
輸出:
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
Global and Local Parameters
Python允許我們通過使用全局和局部參數來限製各種變量和方法的使用,而這可能並不需要。這些局部和全局參數主要用於局部或全局變量字典。如果缺少局部變量,則全局參數將超過,這意味著全局變量可用於兩個字段。讓我們看看代碼如何僅傳遞全局參數。
例:
# Here we have passed an empty dictionary
from math import *
exec("print(dir())", {})
輸出:
['__builtins__']
因此,我們看到在將空字典作為全局參數傳遞時,僅顯示__builtins__,而沒有顯示其他數學函數,如上例所示。這意味著對象參數僅支持__builtins__。這表明所有其他函數都限製在對象上。為了證明這一點,讓我們嘗試使用數學函數,看看會發生什麽。
例:
# An exception will be raised
from math import *
exec("print(factorial(5))", {})
輸出:
No Output
此示例應已打印120作為輸出,但是,它顯示No Output並引發異常。盡管我們已導入數學模塊,但factorial()方法由於通過傳遞全局參數而設置的限製而無法使用。
我們還可以允許許多函數中的少數幾個執行。假設我們要限製除factorial()函數以外的所有其他數學模塊。
例:
# factorial() will be executed
from math import *
exec("print(factorial(5))", {"factorial":factorial})
輸出:
120
我們還可以更改這些預定義方法的名稱,並在執行過程中為它們提供用戶定義的名稱。我們可以將函數的名稱從factorial()更改為fact(),這是用戶定義的。例:
# factorial() renamed as fact
from math import *
exec('print(fact(5))', {'fact':factorial})
輸出:
120
現在,讓我們看看在傳遞全局和局部參數時我們還能做些什麽。使用局部參數,我們可以根據需要實現函數。
例:
from math import *
exec("print(dir())", {"built" :__builtins__}, {"sum":sum, "iter":iter})
輸出:
['dir', 'print', 'sum']
僅通過該求和,迭代方法以及所有內置方法就可以在exec()函數內部執行。
我們還可以像這樣限製__builtins__的使用:
#__builtins__ has been restricted using None
from math import *
exec("print(dir())", {"__builtins__" :None}, {"sum":sum, "print":print, "dir":dir})
輸出:
['dir', 'print', 'sum']
在這裏,僅sum,print和dir方法將在exec()函數內部執行,而並非所有內置方法都將執行。
相關用法
注:本文由純淨天空篩選整理自 exec() in Python。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。