当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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