📜  exec函数家族(1)

📅  最后修改于: 2023-12-03 15:00:39.802000             🧑  作者: Mango

exec函数家族介绍

在 Python 中,有一类函数被称为“exec 函数家族”,它们都可以让程序在运行时动态地执行语句、代码块,从而对程序进行修改、扩展,甚至实现一定程度上的反射功能。这一系列函数包括 exec、eval、compile 等。

exec 函数

exec 是最基本的动态执行代码函数,其语法结构如下:

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

其中,object 参数可以传入字符串(包括代码块)或代码对象,globals 和 locals 是可选的命名空间(字典),用于指定代码执行的全局和局部命名空间。例如:

# 字符串对象
exec('print("Hello, world!")')

# 代码块对象
code = """
for i in range(3):
    print(i)
"""
exec(compile(code, '', 'exec'))

# 指定命名空间
globals_dict = {'a': 1}
locals_dict = {'b': 2}
code = """
sum = a + b
print(sum)
"""
exec(compile(code, '', 'exec'), globals_dict, locals_dict)
eval 函数

eval 函数与 exec 函数类似,不同之处在于它只能处理单个表达式,且可返回执行结果。其语法结构如下:

eval(expression[, globals[, locals]])

其中,expression 参数可以是字符串或代码对象,且必须是单个表达式,globals 和 locals 参数同样是可选的命名空间。例如:

# 字符串对象
result = eval('2 * 3 + 5')
print(result)

# 指定命名空间
globals_dict = {'a': 1}
locals_dict = {'b': 2}
result = eval('a + b', globals_dict, locals_dict)
print(result)
compile 函数

compile 函数用于将字符串或文件内容编译为代码对象,其语法结构如下:

compile(source, filename, mode[, flags[, dont_inherit]])

其中,source 为字符串或文件内容,filename 为字符串类型的文件名或 "",mode 指定代码类型,可以是 'exec'(代码块)、 'eval'(单个表达式)或 'single'(单个语句);flags 表示编译器的特性,可选;dont_inherit 表示是否继承本地命名空间,可选。例如:

# 将字符串编译为代码块对象
code_obj = compile('print("Hello, world!")', '', 'exec')
exec(code_obj)

# 将文件内容编译为单个表达式对象
code_obj = compile('2 * 3 + 5', '<string>', 'eval')
result = eval(code_obj)
print(result)

综上所述,exec 函数家族是 Python 提供的一系列动态执行代码的强大函数,可以处理字符串、代码块、代码对象等形式的代码,能够支持动态扩展、反射等功能。了解 exec 函数家族,将有助于 Python 开发者灵活地应对各种编程场景。