将扩展模块移植到Python 3 author: Benjamin Peterson 摘要 虽然改变C-API不是Python 3的目标之一,许多Python级别的更改使得Python 2的API无法实现。事实上,在//级别上,int()和long()统一等一些变化更为明显。本文档努力记录不兼容性以及它们如何解决. 条件编译 只编译Python 3的一些代码的最简单方法是检查PY_MAJOR_VERSION大于或等于3. #if PY_MAJOR_VERSION >= 3 #define IS_PY3K #endif API不存在的函数可以在条件块中等同于它们的等价物 更改为对象API

支持循环垃圾收集 Python对检测和收集涉及循环引用的垃圾的支持需要来自对象类型的支持,对象类型是其他对象的“容器”,也可以是容器。不存储对其他对象的引用或仅存储对原子类型(如数字或字符串)的引用的类型不需要为garbagecollection提供任何显式支持. 要创建容器类型,类型对象的tp_flags字段必须包含Py_TPFLAGS_HAVE_GC并提供tp_traverse处理程序的实现。如果该类型的实例是可变的,那么tp_clear还必须提供实现. Py_TPFLAGS_HAVE_GC 具有此标志集的类型的对象必须符合此处记录的规则。为方便起见,这些对象将被称为容器对象. 容器类型的

类型对象 也许Python对象系统最重要的结构之一是定义新类型的结构:PyTypeObject结构。可以使用PyObject_*()或PyType_*()函数中的任何一个来处理类型对象,但是对于大多数Python应用程序来说,它们并没有提供太多有趣的东西。这些对象是对象行为的基础,对于解释器本身以及实现新类型的任何扩展模块非常重要. 与大多数标准类型相比,类型对象相当大。大小的原因是每个类型对象存储大量值,主要是Cfunction指针,每个指针都实现了类型功能的一小部分。本节详细介绍了类型对象的字段。这些字段将按照它们在结构中的顺序进行描述. Typedef:unaryfunc,binaryf

公共对象结构 在Python的对象类型的定义中使用了大量结构。本节描述了这些结构及其使用方法. 所有Python对象最终在对象在内存中的表示开头共享少量字段。它们由PyObject和PyVarObject类型表示,它们又由一些宏的扩展定义,无论是直接还是间接地在所有其他Python对象的定义中使用. PyObject 所有对象类型都是此类型的扩展名。这是一种包含Python将对象指针作为对象处理的信息的类型。在正常的“发布”版本中,它只包含对象的引用计数和指向相应类型对象的指针。实际上没有声明为PyObject,但每个Python对象都可以转换为PyObject*。访问主题必须使用宏Py_RE

在堆上分配对象 PyObject * _PyObject_New( PyTypeObject  *type) Return value: New reference. PyVarObject * _PyObject_NewVar( PyTypeObject  *type,Py_ssize_t  size) Return value: New reference. PyObject * PyObject_Init( PyObject  *op,PyTypeObject  *type) Return value: Borrowed reference. 使用类型和初始引用初始化一个新分配的对象op

内存管理 概述 Python中的内存管理涉及包含所有Python对象和数据结构的私有堆。//私有堆的管理由Python memory manager在内部确保。Python内存管理器具有不同的组件,可以处理各种动态存储管理方面,如共享,分段,预分配或缓存. 在最低级别,原始内存分配器通过与操作系统的主题管理器交互来确保私有堆中有足够的空间来存储所有与Python相关的数据。在原始内存分配器之上,几个特定于对象的分配器在同一个堆上运行,并实现了适合每种对象类型特性的内存管理策略。例如,整数对象在堆字符串,元组或字典中的管理方式不同,因为整数意味着不同的存储要求和速度/空间权衡。Python内存管

DateTime Objects 各种日期和时间对象由datetime模块提供。在使用任何这些函数之前,头文件datetime.h必须包含在你的来源中(注意这不包含在Python.h中)和宏PyDateTime_IMPORT必须调用,通常作为模块初始化函数的一部分。宏将一个指向C结构的指针放到一个静态变量PyDateTimeAPI中,由下面的macros使用 用于访问UTC singleton的宏: PyObject * PyDateTime_TimeZone_UTC 返回表示UTC的时区单例,与datetime.timezone.utc. 相同的对象,版本3.7. Type-check ma

上下文变量对象 注意 在版本3.7.1中更改: 在Python 3.7.1中,所有上下文变量C的签名都是更改使用PyObject指针代替PyContext, PyContextVar,和PyContextToken,例如: // in 3.7.0: PyContext *PyContext_New(void); // in 3.7.1+: PyObject *PyContext_New(void); 有关详细信息,请参阅bpo-34762 . 版本3.7. 本节详细介绍了contextvarsmodule. PyContext C结构用来表示contextvars.Context宾语。 PyC

Coroutine Objects 版本3.5中的新功能 协程对象是用asynckeywordreturn. PyCoroObject 用于协程对象的C结构. PyTypeObject PyCoro_Type 与协程对象对应的类型对​​象. int PyCoro_CheckExact(的PyObject  *ob) 如果ob的类型是PyCoro_Type;ob必须不 NULL. PyObject * PyCoro_New(PyFrameObject  *frame,PyObject  *name,PyObject  *qualname) Return value: New reference.

生成器对象 生成器对象是Python用来实现生成器迭代器的对象。它们通常是通过迭代产生值的函数来创建的,而不是明确地调用PyGen_New()或PyGen_NewWithQualName(). PyGenObject 用于生成器对象的C结构. PyTypeObject PyGen_Type 对应于生成器对象的类型对象. int PyGen_Check( PyObject  *ob) 如果ob是一个发电机对象;ob必须不 NULL. int PyGen_CheckExact(的PyObject  *ob) 如果ob的类型是PyGen_Type;ob必须不 NULL. PyObject * PyG