Python - eval 和 exec 函数

本文最后更新于:2022年7月6日 下午

Python 支持通过 eval 函数执行字符串命令,本文记录相关内容。

eval

  • eval() 函数用来执行一个字符串表达式,并返回表达式的值。

语法

  • 以下是 eval() 方法的语法:
1
eval(expression[, globals[, locals]])

参数

  • expression – 表达式。
  • globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
  • locals – 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

示例

1
2
3
4
5
a="[1,2,3,4,5]"
b=eval(a)

>>>
b = [1, 2, 3, 4, 5]

exec

  • exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码。

语法

1
exec(object[, globals[, locals]])

参数

  • object:必选参数,表示需要被指定的 Python 代码。它必须是字符串或 code 对象。如果 object 是一个字符串,该字符串会先被解析为一组 Python 语句,然后再执行(除非发生语法错误)。如果 object 是一个 code 对象,那么它只是被简单的执行。
  • globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。
  • locals:可选参数,表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与 globals 相同的值。

返回值

exec 返回值永远为 None。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>>exec('print("Hello World")')
Hello World
# 单行语句字符串
>>> exec("print ('runoob.com')")
runoob.com

# 多行语句字符串
>>> exec ("""for i in range(5):
... print ("iter time: %d" % i)
... """)
iter time: 0
iter time: 1
iter time: 2
iter time: 3
iter time: 4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
x = 10
expr = """
z = 30
sum = x + y + z
print(sum)
"""
def func():
y = 20
exec(expr)
exec(expr, {'x': 1, 'y': 2})
exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4})

func()

>>>
60
33
34

区别示例

eval 仅执行表达式,复杂的语句无法执行,但可以使用 exec,以导入模块为例

  • 导入模块时不可以使用 eval 函数

    如果我执行import vfs_tests as v,它就会起作用。但是,使用eval()的同一导入(如eval(‘import vfs_tests as v’))会引发语法错误。

  • eval只适用于表达式,import是一种语句,可以使用 exec 语句

  • exec('import vfs_tests as v')
    
    1
    2
    3
    4
    5
    6

    > 额外地,对于导入模块也可以使用 importlib 模块:
    >
    > ```python
    > import importlib
    > mod = importlib.import_module('vfs_tests')

参考资料


Python - eval 和 exec 函数
https://www.zywvvd.com/notes/coding/python/python-eval/python-eval/
作者
Yiwei Zhang
发布于
2022年7月6日
许可协议