Skip to main content

Python内核理解

本系列介绍 CPython 内核相关的标准库模块,掌握这些模块有助于理解「Python 如何运行」、排查性能与内存问题,以及做元编程与扩展开发。

📄️ dis

dis 模块用于反汇编 Python 字节码,将 CPython 在基于栈的虚拟机上执行的指令以可读形式展示。CPython 的编译流程是:源码 → 字节码(bytecode)→ 解释器按指令逐条执行;字节码是实现细节,不同 Python 版本可能增删改指令,dis 让我们在需要时看清「这段 Python 代码实际对应哪些底层操作」,便于调试、性能分析和理解语法编译结果。设计上,该模块面向调试(如配合 traceback 定位异常指令)、性能分析(对比不同写法的指令数与类型)以及语法理解(如 match/case、列表推导、with、装饰器等如何被编译成字节码),以官方文档和 Include/opcode.h 中的定义为准。

📄️ inspect

inspect 是 Python 标准库中的自省(introspection)模块,用于在运行时获取“活对象”的详细信息。它可操作的对象包括:模块、类、方法、函数、回溯(traceback)、帧对象(frame)和代码对象(code object)。典型用途包括:类型检查(是否为类/函数/方法/生成器/协程等)、获取源码与文档字符串、格式化参数列表、获取函数签名(参数名、默认值、注解、POSITIONAL_ONLY 等)、以及检查解释器调用堆栈和当前执行帧。官方文档将上述能力归纳为四类服务:类型检查、获取源码、检查类与函数、检查解释器调用堆栈。

📄️ types

types 模块主要做两件事:为解释器内部使用的若干对象类型提供名称常量,以及提供动态创建类型(类、模块等)的工具函数。像 int、str、list 这类内置类型在全局命名空间里就有名字,可直接用于 isinstance() / issubclass();而函数对象、生成器、模块、代码对象等类型的「类型名」并不作为内置名暴露,若要按类型做判断或元编程,就需要通过 types 获取(如 types.FunctionType、types.ModuleType)。此外,PEP 484 引入的类型提示体系与 PEP 585 在标准库中推广的泛型语法(如 list[int])在运行时会表现为 types.GenericAlias,联合类型表达式 int | str(PEP 604,Python 3.10+)的类型为 types.UnionType,这些也由 types 提供,便于在运行时做类型内省。设计上,该模块刻意只暴露「实现解释器或类型系统时常用」的类型名,避免把偶然出现的内部类型(如 listiterator)也纳入;动态创建方面则提供 newclass()、prepareclass()、ModuleType 等接口,与元类机制(PEP 3115)及泛型解析(PEP 560)相配合,用于在运行时按需构造类或模块对象。