當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python exec()用法及代碼示例


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。