Python 的内置函数 compile

作者:IMPYLH日期:2025/10/23

Python 内建函数列表 > Python 的内置函数 compile

Python 的内置函数 compile() 是一个强大的工具,它允许将源代码编译为代码对象或 AST(抽象语法树)对象。该函数主要用于动态执行 Python 代码,常见于需要运行时编译代码的场景。

基本语法

1compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
2    '''
3    将字符串或文件编译成代码或 AST 对象
4
5    :param source: 字符串、字节字符串,或者 AST 对象
6    :param filename: 文件名或 '<string>'
7    :param mode: 'exec', 'eval' 或 'single'
8    :param flags: 特性
9    :param dont_inherit: 是否继承
10    :param optimize: 优化级别
11    :return: 代码或 AST 对象
12    '''
13

使用示例

  1. 编译表达式:
1code = compile('3 + 5 * 2', '<string>', 'eval')
2result = eval(code)  # 结果为13
3

点击运行

  1. 编译多行代码:
1code = """\
2def greet(name):
3    return f"Hello, {name}!"
4"""
5compiled = compile(code, 'greet_module', 'exec')
6exec(compiled)
7print(greet("Alice"))  # 输出:Hello, Alice!
8

点击运行

Python 的内置函数 compile() 是用于将 Python 源代码编译为可执行代码对象的重要工具。这个函数接收源代码字符串作为输入,并将其转换为可以被 exec()eval() 执行的代码对象。

函数签名

1compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
2

参数详解

  1. source
    • 必须参数,表示要编译的 Python 源代码
    • 可以是字符串、字节字符串或 AST(抽象语法树)对象
    • 示例:
    1source_code = "print('Hello, World!')"  
  2. filename
    • 指定源代码的文件名
    • 如果代码不是从文件中读取的,可以传递任意可识别的名称(如 “”)
    • 该名称会出现在错误信息中
    • 示例:
    1filename = "example.py"  
  3. mode
    • 指定编译模式,有三种可选值:
      * 'exec':用于编译模块级代码(可以包含多条语句)
      * 'eval':用于编译单个表达式
      * 'single':用于编译交互式语句(如 REPL 环境中的单条语句)
    • 示例:
    1mode = 'exec'  
  4. flags(可选):
    • 控制编译器的行为
    • 可以是 __future__ 特征的组合(如 compiler.PyCF_ALLOW_TOP_LEVEL_AWAIT
  5. dont_inherit(可选):
    • 布尔值,默认为 False
    • 如果为 True,则编译时不会继承当前环境的 __future__ 特征
  6. optimize(可选):
    • 指定优化级别:
      * -1:使用解释器的 -O 选项值
      * 0:不优化
      * 12:不同程度的优化

返回值

函数返回一个代码对象,该对象可以传递给 exec()eval() 执行。

使用示例

  1. 基本用法
1code = compile('print("Hello")', '<string>', 'exec')
2exec(code)
3
  1. 表达式评估
1expression = compile('3 + 5 * 2', '<string>', 'eval')
2result = eval(expression)  # 返回 13
3
  1. 交互式模式
1code = compile('x = 5\ny = 10\nx + y', '<string>', 'single')
2exec(code)  # 会输出 15
3

应用场景

  1. 动态代码执行:当需要从配置文件或用户输入中获取并执行代码时
    • 典型应用场景包括插件系统开发,比如IDE允许用户编写脚本扩展功能
    • 配置文件示例:YAML文件中包含Python代码片段,运行时通过eval()或exec()解析执行
    • 安全考虑:必须配合严格的白名单机制和沙箱环境,防止代码注入攻击
    • 实际案例:Django模板引擎动态解析模板标签中的Python表达式
  2. 代码优化:在需要多次执行相同代码时,先编译可提高性能
    • 工作原理:将源代码转换为字节码后重复使用,避免每次重新解析
    • 性能对比:编译后的代码执行速度可提升2-5倍(根据Python官方基准测试)
    • 关键方法:使用compile()函数生成代码对象,配合exec()或eval()执行
    • 经典应用:科学计算库(如NumPy)会在内部对运算表达式进行预编译
  3. 元编程:构建代码生成工具或DSL(领域特定语言)时
    • 典型实现方式:通过ast模块解析和修改抽象语法树
    • 常见用例:ORM框架自动生成数据库查询语句,如Django的Q对象
    • DSL示例:构建特定领域配置语言,如Ansible的YAML剧本转换为Python代码
    • 高级技巧:使用装饰器、描述符和metaclass组合实现复杂的元编程逻辑

注意事项

  1. 使用 compile() 执行不可信代码存在安全风险
  2. 编译后的代码对象不能跨 Python 版本使用
  3. 在大多数情况下,直接使用 eval()exec() 更方便

错误处理

1try:
2    code = compile(invalid_code, '<string>', 'exec')
3except SyntaxError as e:
4    print(f"Syntax error: {e}")
5

通过合理使用 compile() 函数,可以实现更灵活和高效的 Python 代码执行方式。


Python 的内置函数 compile》 是转载文章,点击查看原文


相关推荐


驾校管理系统|基于java和小程序的驾校管理系统设计与实现(源码+数据库+文档)
伟庭大师兄2025/10/22

驾校管理系统平台 目录 基于java和小程序的驾校管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码  六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专家博主,CSDN平台Java领域优质创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。✌️ 主要项目:小程序、SpringBoot、SSM、Vue、Html、Jsp、Nodejs等


C#.NET FluentValidation 全面解析:优雅实现对象验证
唐青枫2025/10/21

简介 FluentValidation 是一个基于“流式 API”(Fluent API)的 .NET 验证框架,用于在应用层对模型(DTO、ViewModel、Entity 等)进行声明式验证。 核心优势: 高可读性:通过链式方法配置验证规则,逻辑清晰; 可复用:将验证代码从业务逻辑中分离,易于单元测试; 丰富的内置规则:邮箱、长度、正则、多字段联动、集合验证等; 可扩展:支持自定义验证器、异步验证、跨属性验证。 适用场景: Web API 模型验证 复


解密prompt系列62. Agent Memory一览 - MATTS & CFGM & MIRIX
风雨中的小七2025/10/20

今天我们再来聊聊AI智能体中至关重要的组件——记忆系统,它能有效避免的Agent像只只有7秒记忆的金鱼,不断重复错误,循环往复。 记忆的两种面孔:LLM Memory vs Agent Memory 之前我们探讨过Mem0和LlamaIndex对大模型记忆的工程化实现,但这两个库更侧重于LLM Memory而非Agent Memory。这两者有何不同?本质上Agent Memory是包含了LLM Memory的。那增量的差异来自 LLM Memory:更像是事实备忘录,记录对话中的具体事实和场


Docker 实战教程(7) | 镜像管理和仓库操作
致宏Rex2025/10/18

前边篇章我们已经介绍了 Docker 基础概念和安装Docker 常用命令实践Docker 网络机制详解Docker 数据卷和挂载Dockerfile 编写和镜像构建Docker Compose 多容器编排 本篇为系列最后一章,介绍 Docker 的镜像管理和仓库操作。 本教程侧重于命令实践和理解,提供可在本地环境测试的实例,每章结束都有总结要点。 7.1 Docker 镜像管理基础 我们之前介绍过一期自建镜像站的若干方案: Docker 管理 | 代理配置、内网共享和 Ha


Redis(67)Redis的SETNX命令是如何工作的?
Victor3562025/10/17

SETNX 是 Redis 提供的一个原子性命令,用于在键不存在时设置键值对。SETNX 是 "SET if Not eXists" 的缩写,主要应用于实现分布式锁等场景。下面是详细的工作原理以及如何在 Java 中使用 SETNX 命令的示例。 SETNX 命令的工作原理 检查键是否存在:Redis 首先检查给定的键是否存在。 设置键值对:如果键不存在,Redis 将设置键值对,并返回 1。 不做任何操作:如果键已经存在,Redis 不会设置新的值,并返回 0。 Java 使用 SETNX


什么是断言?
你的人类朋友2025/10/15

前言 你好啊,我是你的人类朋友! 今天主要介绍断言(Assertion)相关的知识。 先定个小目标:看完你将可以用自己的语言向别人解释:啥是断言? 正文 一、初印象 断言(Assertion)在信息安全领域中,是一种用于证明身份的数字凭证。 简单来说,断言是一个【包含身份声明信息的安全令牌】,用于向服务端证明客户端的合法身份。 它通常包含三要素: 身份标识(如:AppId) 验证凭证(如:加密的 Secret) 完整性证明(如:数字签名) 二、工作流程 断言的工作过程可以分为四个核心步骤:


Kotlin互斥锁(Mutex):协程的线程安全守护神
稀有猿诉2025/10/14

本文译自「Kotlin Mutex: Thread-Safe Concurrency for Coroutines」,原文链接carrion.dev/en/posts/ko…,由Ignacio Carrión发布于2025年10月3日。 使用 Kotlin 协程构建并发应用程序时,保护共享的可变状态至关重要。虽然传统的 Java 同步工具(例如 synchronized 块和 ReentrantLock)可以正常工作,但它们会阻塞线程,并且与协程的挂起模型不兼容。因此,引入 Mutex——一


Coze源码分析-资源库-编辑数据库-前端源码-核心逻辑与接口
lypzcgf2025/10/13

编辑数据库逻辑 1. 表单验证系统 文件位置:frontend/packages/data/memory/database-v2-base/src/components/base-info-modal/index.tsx 编辑数据库表单的验证规则: // 数据库名称验证规则 const nameValidationRules = [ { required: true, whitespace: true, message: I18n.t('database_name_c


C++ 中 rfind 方法详解
oioihoii2025/10/11

rfind 是 C++ 字符串类 std::string 和 std::wstring 的成员函数,用于从字符串的末尾向前搜索指定的子字符串或字符。 函数原型 // 搜索整个字符串 size_type rfind(const basic_string& str, size_type pos = npos) const noexcept; size_type rfind(const CharT* s, size_type pos = npos) const; size_type rfind(Cha


HTML 元素帮助手册
hubenchang05152025/10/9

#HTML 元素帮助手册 转载自 MDN #主根元素 元素描述<html>表示一个 HTML 文档的根(顶级元素),所以它也被称为根元素。所有其它元素必须是此元素的后代。 #文档元数据 元素描述<base>指定用于一个文档中包含的所有相对 URL 的根 URL。一份中只能有一个该元素。<head>包含文档相关的配置信息(元数据),包括文档的标题、脚本和样式表等。<link>指定当前文档与外部资源的关系。该元素最常用于链接 CSS,此外也可以被用来创建站点图标(比如“favicon”样式图标和

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0