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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。