PEP 286 – 增强型参数元组
- 作者:
- Martin von Löwis <martin at v.loewis.de>
- 状态:
- 已延期
- 类型:
- 标准跟踪
- 创建:
- 2002年3月3日
- Python 版本:
- 2.3
- 历史记录:
摘要
PyArg_ParseTuple
在参数转换器创建新内存时面临着困难的内存管理问题。为了处理这些情况,提出了一种专门的参数类型。
PEP 延期
由于缺乏当前对推动 PEP 目标、收集和整合反馈以及有足够可用时间有效地做到这一点感兴趣的维护者,因此对本 PEP 中涵盖的概念的进一步探索已被延期。
此 PEP 的解决也可能受到 PEP 426 的解决的影响,该 PEP 提议使用预处理步骤来生成某些 C API 接口代码。
问题描述
今天,参数元组保留对函数参数的引用,这些参数保证在参数元组存在期间一直存在,至少在函数调用执行期间一直存在。
在某些情况下,解析参数将分配新的内存,然后由调用者释放。这有两个问题
提议的解决方案
引入了新的类型“参数元组”。此类型派生自元组,并添加了一个 __dict__
成员(在 tp_dictoffset
-4)。此类型的实例可能会获得以下属性
- “failobjects”,一个在成功的情况下需要释放的对象列表
- “okobjects”,一个在释放参数元组时将释放的对象列表
为了管理此类型,将添加以下函数,并在 ceval.c
和 getargs.c
中适当地使用它们
PyArgTuple_New(int);
PyArgTuple_AddFailObject(PyObject*, PyObject*);
PyArgTuple_AddFailMemory(PyObject*, void*);
PyArgTuple_AddOkObject(PyObject*, PyObject*);
PyArgTuple_AddOkMemory(PyObject*, void*);
PyArgTuple_ClearFailed(PyObject*);
当参数解析失败时,所有失败对象都将通过 Py_DECREF
释放,所有失败内存都将通过 PyMem_Free
释放。如果解析成功,则会删除对失败对象和失败内存的引用,而不会释放任何内容。
当释放参数元组时,将释放所有 ok 对象和内存。
如果使用不同类型的对象调用这些函数,则会发出警告,并且不会采取任何进一步的操作;在不使用参数元组的情况下使用受影响的转换器已弃用。
受影响的转换器
以下转换器将添加失败内存和失败对象:N
、es
、et
、es#
、et#
(除非将内存传递到转换器中)
新的转换器
为了简化 Unicode 转换,e*
转换器被复制为 E*
转换器(Es
、Et
、Es#
、Et#
)。E*
转换器的用法与 e*
转换器的用法相同,除了应用程序不需要管理结果内存之外。这将通过在参数元组中注册 Ok 对象来实现。e*
转换器已弃用。
参考文献
版权
本文档已进入公有领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0286.rst