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