Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

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 接口代码的某些方面。

问题描述

今天,参数元组保留对函数参数的引用,这些引用保证在参数元组存在期间(至少在函数调用执行期间)有效。

在某些情况下,解析参数会分配新内存,然后由调用者释放。这有两个问题:

  1. 如果失败,应用程序无法知道要释放哪些内存;大多数调用者甚至不知道他们有责任释放这些内存。例如,N 转换器(bug #416288 [1])和 es# 转换器(bug #501716 [2])就是这种情况。
  2. 即使参数解析成功,调用者仍需负责释放内存,这很不方便。在某些情况下,这是不必要的低效。例如,es 转换器将转换结果复制到内存中,即使已经有一个具有正确内容的字符串对象。

提议的解决方案

引入了一种新的“参数元组”类型。此类型继承自元组,并添加了一个 __dict__ 成员(在 tp_dictoffset -4)。此类型的实例可能具有以下属性:

  • ‘failobjects’,在成功的情况下需要取消分配的对象列表
  • ‘okobjects’,在参数元组被释放时将被释放的对象列表

为了管理这种类型,将添加以下函数,并在 ceval.cgetargs.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 对象和内存将被释放。

如果使用其他类型的对象调用这些函数,将发出警告并且不采取进一步操作;未使用参数元组的受影响转换器的使用已被弃用。

受影响的转换器

以下转换器将添加失败内存和失败对象:Nesetes#et#(除非内存已传入转换器)

新的转换器

为了简化 Unicode 转换,e* 转换器被复制为 E* 转换器(EsEtEs#Et#)。E* 转换器的用法与 e* 转换器的用法相同,只是应用程序不需要管理生成的内存。这将通过向参数元组注册 Ok 对象来实现。e* 转换器已被弃用。

参考资料


来源:https://github.com/python/peps/blob/main/peps/pep-0286.rst

最后修改:2025-02-01 08:55:40 GMT