CPython 实现原理
  • README
  • 一、简介
    • 1.1 如何使用此书
    • 1.2 额外材料和学习资料
  • 二、获取 CPython 源码
    • 2.1 源代码里有什么?
  • 三、准备你的开发环境
    • 3.1 选IDE还是编辑器?
    • 3.2 安装Visual Studio
    • 3.3 安装Visual Studio Code
    • 3.4 安装JetBrains Clion
    • 3.5 安装Vim
    • 3.6 总结
  • 四、编译 CPython
    • 4.1 在 macOS 上编译 CPython
    • 4.2 在 Linux 上编译 CPython
    • 4.3 安装自定义版本
    • 4.4 make 快速入门
    • 4.5 CPython 的 make 目标
    • 4.6 在 Windows 上编译 CPython
    • 4.7 PGO 优化
    • 4.8 总结
  • 五、Python 语言和语法
    • 5.1 为什么 CPython 是用 C 语言而不是用 Python 语言来实现
    • 5.2 Python 语言规范
    • 5.3 分析器生成器
    • 5.4 重新生成语法
    • 5.5 总结
  • 六、配置和输入
    • 6.1 配置状态
    • 6.2 构建配置
    • 6.3 从输入构建模块
    • 6.4 总结
  • 七、基于语法树的词法分析和解析
    • 7.1 具象语法树生成器
    • 7.2 CPython 解析器-分词器
    • 7.3 抽象语法树
    • 7.4 要记住的术语
    • 7.5 一个示例:添加一个约等于比较运算法
    • 7.6 总结
  • 八、编译器
    • 8.1 相关源文件
    • 8.2 重要的专业术语
    • 8.3 实例化一个编译器
    • 8.4 未来标志和编译器标志
    • 8.5 符号表
    • 8.6 核心编译过程
    • 8.7 汇编
    • 8.8 创建一个 Code Object
    • 8.9 使用 Instaviz 展示 Code Object
    • 8.10 一个示例:实现约等于操作符
    • 8.11 总结
  • 九、求值循环
    • 9.1 构建线程状态
    • 9.2 构建帧对象
    • 9.3 帧的执行
    • 9.4 值栈
    • 9.5 例子:在列表中添加元素
    • 9.6 总结
  • 十、内存管理
    • 10.1 C 中的内存分配
    • 10.2 Python 内存管理系统设计
    • 10.3 CPython 内存分配器
  • 十一、并行和并发
    • 11.1 并行和并发模型
    • 11.2 进程的结构
    • 11.3 多进程并行
    • 11.4 多线程
    • 11.5 异步编程
    • 11.6 生成器
    • 11.7 协程
    • 11.8 异步生成器
    • 11.9 子解释器
    • 11.10 总结
  • 十二、对象和类型
    • 12.1 本章的例子
    • 12.2 内置类型
    • 12.3 对象和可变长度对象类型
    • 12.4 类型类
    • 12.5 布尔和整数类型
    • 12.6 Unicode 字符串类型
    • 12.7 字典类型
    • 12.8 总结
  • 十三、标准库
    • 13.1 Python 模块
    • 13.2 Python 和 C 模块
  • 十四、测试套件
    • 14.1 在 Windows 上运行测试套件
    • 14.2 在 Linux 或 MacOS 上运行测试套件
    • 14.3 测试标志
    • 14.4 运行特定测试
    • 14.5 测试模块
    • 14.6 测试工具
    • 14.7 总结
  • 十五、调试
  • 十六、基准测试、性能分析和追踪
  • 十七、下一步计划
    • 17.1 为 CPython 编写 C 扩展
    • 17.2 改进你的 Python 应用程序
    • 17.3 为 CPython 项目做贡献
    • 17.4 继续学习
  • 十八、附录
    • 18.1 C 预处理器
    • 18.2 基础 C 语法
    • 18.3 总结
  • 致谢
Powered by GitBook
On this page
  • 问题分类
  • 创建一个 Pull Request 来修复问题
  • 其他贡献
Edit on GitHub
  1. 十七、下一步计划

17.3 为 CPython 项目做贡献

Previous17.2 改进你的 Python 应用程序Next17.4 继续学习

Last updated 2 years ago

在 12 个月的时间里,CPython 有 12 个新的小版本,数百个更改和错误报告,以及数千个对源代码的提交。

CPython 是世界上最大、最有活力、最开放的软件项目之一。你在这本书中获得的知识将使你在指引、理解和帮助改进 CPython 项目方面有一个巨大的领先优势。

CPython 社区渴望有更多的贡献者。但在提交对 CPython 的更改、改进或修复之前,你需要知道从哪里开始。以下是一些想法:

  1. 开发人员在 bugs.python.org 上创建分类问题;

  2. 解决描述良好的小问题。

让我们更详细地探讨其中的每一个想法。

重要

译者注:Python 的问题单管理服务于 2022 年 3 月从 bugs.python.org 迁移至

问题分类

所有错误报告和更改请求首先都提交到 bugs.python.org,也称为 BPO。这个网站是 CPython 项目的错误跟踪器。如果你想在 GitHub 上提交一个 Pull Request,那么你首先需要一个 BPO 序号,这是由 BPO(bugs.python.org)创建的问题序号。

首先,你要到左侧菜单上的 User/Register 先注册一个账号。

默认视图并不是特别有效,它同时显示了用户提出的问题和核心开发人员提出的问题,这些问题可能已经被解决了。

在登录后,请转到左侧菜单上的 Your Queries/Edit。此页面将为你提供一个可添加书签的问题索引查询列表:

图片不翻译

更改值到 leave in 中,以将这些查询包含在 Your Queries 菜单中:

以下是我觉得有用的一些查询:

  • Easy Documentation Issues:尚未进行的文档改进;

  • Easy Tasks:被确定为适合初学者的任务;

  • Recently Created:最近创建的问题;

  • Reports Without Replies:从未得到回复的 Bug 报告;

  • Unread:从未被读取的Bug报告;

  • 50 Latest Issues:最近更新的五十个问题。

有了这些视图,你可以按照 “问题分类” 指南了解评论问题的最新流程。

创建一个 Pull Request 来修复问题

当你解决了一个问题后,你就可以开始创建一个修复 Pull Request 并将其提交给 CPython 项目。流程如下:

  1. 确保你有一个 BPO 序号;

  2. 在你的 CPython 的 fork 仓上创建一个分支。有关下载源代码的步骤,请参阅“获取源代码”章节;

  3. 创建一个测试来重现问题。有关步骤,请参阅“测试套件”章节中的“测试模块”小节;

  4. 确保你的更改符合 PEP 7 和 PEP 8 风格指南;

  5. 运行回归测试套件以确认所有测试都通过。当你提交 Pull Request 时,回归测试套件将自动在 GitHub 上运行,但最好先在本地进行检查。有关步骤,请参阅“测试套件”章节;

  6. 提交并将你的更改推送到 GitHub;

  7. 访问 github.com/python/cpython 并为你的分支创建一个 Pull Request。

提交 Pull Request 后,它将由一个分类团队成员进行分类,并分配给核心开发人员或团队进行检视。

如前所述,CPython 项目需要更多的贡献者。从你提交更改到被检视之间的时间可能是一小时、一周或几个月。如果你没有立即得到回应请不要沮丧。大多数核心开发者都是志愿者,他们倾向于批量检视或合并 Pull Request。

重要

每个 Pull Request 只修复一个问题是很重要的。如果你在写补丁时,在代码中看到一个单独的、不相关的问题,请记下这个问题并将其作为第二个 Pull Request 提交。

为了帮助你快速合并更改,对问题、解决方案和修复进行良好的解释会有很大帮助。

其他贡献

除了修复错误之外,你还可以对 CPython 项目进行一些不同类型的改进:

  • 许多标准库函数和模块都缺少单元测试。你可以写一些测试并提交给项目;

  • 许多标准库函数没有最新的文档。你可以更新文档并提交更改。

https://github.com/python/cpython/issues