类实现PEP 3118时Python2.7中PyBufferProc的定义
我正在扩展我们图书馆的课程 (支持Python2.7)来支持,已经 后端口为2.7 从文档中,我需要 初始化要指向的类实现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
tp\u as\u buffer
字段
aPyBufferProcs
。但是,在2.7的文档中,仅包含旧版本的条目
缓冲协议。从消息来源来看,我认为
PyBufferProcs
有一些新协议的附加条目
(bf_getbuffer
和bf_releasebuffer
)
问题仍然是:
- 我是否需要做一些特殊的事情来告诉Python 新条目有效吗
- 我必须填写旧协议的条目吗?(修订)
例如,2.7的文档说明
可能不为空。但如果我 支持政治公众人物3118。)bf_getsegcount
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 */