类实现PEP 3118时Python2.7中PyBufferProc的定义

类实现PEP 3118时Python2.7中PyBufferProc的定义,python,python-c-api,python-extensions,pep3118,pybuffer,Python,Python C Api,Python Extensions,Pep3118,Pybuffer,我正在扩展我们图书馆的课程 (支持Python2.7)来支持,已经 后端口为2.7 从文档中,我需要 初始化要指向的tp\u as\u buffer字段 aPyBufferProcs。但是,在2.7的文档中,仅包含旧版本的条目 缓冲协议。从消息来源来看,我认为 PyBufferProcs有一些新协议的附加条目 (bf_getbuffer和bf_releasebuffer) 问题仍然是: 我是否需要做一些特殊的事情来告诉Python 新条目有效吗 我必须填写旧协议的条目吗?(修订) 例如,2.7

我正在扩展我们图书馆的课程 (支持Python2.7)来支持,已经 后端口为2.7

从文档中,我需要 初始化要指向的
tp\u as\u buffer
字段 a
PyBufferProcs
。但是,在2.7的文档中,仅包含旧版本的条目 缓冲协议。从消息来源来看,我认为
PyBufferProcs
有一些新协议的附加条目 (
bf_getbuffer
bf_releasebuffer

问题仍然是:

  • 我是否需要做一些特殊的事情来告诉Python 新条目有效吗

  • 我必须填写旧协议的条目吗?(修订) 例如,2.7的文档说明
    bf_getsegcount
    可能不为空。但如果我 支持政治公众人物3118。)


您只需填写
PyBufferProcs
的最后两个字段,但必须将
Py\u TPFLAGS\u have\u NEWBUFFER
标志添加到您的类型的
tp\u标志中。
这是python2中引入的特殊功能,它使新协议与旧协议一起可用

我不知道为什么没有在任何地方记录这一点,但您可以在python 2.7的
bytearray
类型的定义中看到它的使用(请参阅):

&bytearray作为缓冲区,/*tp作为缓冲区*/ Py_TPFLAGS|Py_TPFLAGS|BASETYPE| Py_TPFLAGS_有新缓冲,/*tp_标志*/

此内容已在评论中发布,但它值得回答。

请查看2.7中的内容,其中包含
bf_getbuffer
bf_releasebuffer
的附加字段。另外,设置
Py\u TPFLAGS\u具有\u NEWBUFFER
。使用宏检查是否设置了此标志。是的,我确实查看了这些内容–但这不是我们要问的问题(除非我遗漏了一些内容,这些是公共的、官方的Python API函数–如果没有适当的(以及不必要的秘密记录)在相关PyBufferProc中设置的内容(如struct def类型中适当指出的)。请帮助我们正确理解所有这些!问题的链接指向Python 3的
bytearray
实现,它没有使用Python 2版本的
PyBufferProcs
,PyBufferProcs有六个字段,包括新缓冲协议的最后两个字段。仅使用新协议只需要这两个字段。Python 3源代码也没有使用
Py\u TPFLAGS\u HAVE\u NEWBUFFER
标志;这只是在Python 2中。设置这个标志是“特殊的东西”这告诉
PyObject\u CheckBuffer
新条目是有效的。@eryksun是正确的。我今天早上用它把我的对象Py\u缓冲了。这有多正确怎么强调都不为过–缺少
Py\u TPFLAGS\u HAVE\u NEWBUFFER
的文档实际上被列为Python错误(q.v.)而且,正如@Bakuriu所说,这是释放PEP 3118所需要的“特别的东西”。是的! &bytearray_as_buffer, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_NEWBUFFER, /* tp_flags */