Python exec 函数的全面指南:动态执行代码的利器

🍀 前言

博客地址:

👋 简介

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() 更适合用于复杂的代码块执行。但同时这两个函数都存在安全风险,使用的时候请谨慎。

💖 欢迎我的关注公众号

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值