🍀 前言
博客地址:
👋 简介
Python exec函数是Python中一个非常重要的函数,它可以执行一段字符串代码,并且可以在运行时创建新的变量和函数。Python exec函数的使用非常灵活,可以用于很多场景,比如动态生成代码、动态加载模块等。本文将从多个角度来分析Python exec函数的使用方法。
📖 正文
1 exec函数的介绍
1.1 函数作用
python内置函数exec支持动态执行python代码,传入exec函数的object实参可以是字符串,也可以是字节码对象。如果object实参是字符串则会被exec函数编译并执行,如果是字节码对象则会被直接执行。通常exec配合compile函数来使用。
1.2 函数定义
exec(object[, globals[, locals]])
参数:
- object 可以是字符串或者字节码对象;
- globals 可选参数,如果提供了必须是字典对象,若不提供,则使用当前作用域里的;
- globalslocals 可选参数,任意字典映射对象。
返回值:无
2 exec函数简单应用
2.1 参数expression的使用
code_str = "x = 10\ny = 20\nprint(x + y)"
exec(code_str)
# 输出结果为 30
exec
函数没有返回值,因此在执行代码的时候,在字符串中使用print
来打印。
2.2 参数globals的使用
x = 10
y = 20
exec('print(x + y)', {'x': 1, 'y': 2})
# 3
exec
函数只提供了globals
参数而忽略了locals
参数,因此locals
会取globals
参数的值,即:x = 1, y = 2,sum = x + y = 3
2.3 参数locals的使用
x = 10
y = 20
exec('print(x + y)', {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
# 4
exec
函数的globals
参数和locals
都被提供了,那么exec
函数会先从全部作用域globals
中找到变量x, 从局部作用域locals
中找到变量y,即:x = 1, y = 3
3 exec函数执行代码块
exec
最大的特点就是可以执行复杂的python代码。
code_str = '''
import json
data = {
"name": "张三",
"age": 18,
}
res = json.dumps(data, ensure_ascii=False)
print(type(res))
print(res)
'''
exec(code_str)
# <class 'str'>
# {"name": "张三", "age": 18}
code_str = '''
from dataclasses import dataclass, field
@dataclass
class Student:
name: str
age: int = 0
# 个人信息
info: str = field(init=False)
def __post_init__(self):
self.info = f'我的名字叫{self.name}, 今年{self.age}岁了'
stu = Student("张三", 20)
print(stu)
'''
exec(code_str)
# Student(name='张三', age=20, info='我的名字叫张三, 今年20岁了')
✏ 总结
在 Python 中,eval() 和 exec() 都可以用于动态执行代码,但它们的具体用途和行为略有不同:
eval()
函数主要用于计算数学表达式或解析字符串中的表达式。它将字符串作为参数,将其作为一个 Python 表达式进行求值并返回结果。eval()
函数可以接受一个字典作为可选参数,用于指定全局和局部命名空间。exec()
函数则用于执行一段代码块,可以是单个语句或多个语句。与eval()
不同,exec()
不会返回任何值,它只是执行代码并将结果存储在变量中(如果指定了变量)。exec()
函数也可以接受一个字典作为可选参数,用于指定全局和局部命名空间。
因此,eval()
和 exec()
的主要区别在于它们的返回值。eval()
返回表达式的计算结果,而 exec()
没有返回值,只是在运行时执行代码。此外,eval()
更适合用于简单的表达式计算,而 exec()
更适合用于复杂的代码块执行。但同时这两个函数都存在安全风险,使用的时候请谨慎。