9

我正在扩展我们库中的类(支持 Python 2.7)以支持PEP 3118,它已向后移植到 2.7。

从文档中,我需要初始化该tp_as_buffer字段以指向一个PyBufferProcs. 但是,从 2.7 的文档中,该结构的描述仅包含旧缓冲区协议的条目。从消息来源中,我收集PyBufferProcs新协议(bf_getbufferbf_releasebuffer)的一些附加条目。

问题仍然存在:

  • 我必须做一些特别的事情来告诉 Python 这些新条目是有效的吗?

  • 我必须填写旧协议的条目吗?(例如,2.7 的文档说,它bf_getsegcount 可能不为空。但如果我支持 PEP 3118,则不应使用此条目。)

4

1 回答 1

2

您可以只填写最后两个字段,PyBufferProcs 您必须将Py_TPFLAGS_HAVE_NEWBUFFER标志添加到tp_flags您的类型。这是在 python2 中引入的特殊功能,它使新协议与旧协议一起可用。

我不知道为什么在任何地方都没有记录,但是您可以看到它在bytearraypython 2.7 的类型定义中使用(请参见此处):

    &bytearray_as_buffer, /* tp_as_buffer */
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
    Py_TPFLAGS_HAVE_NEWBUFFER , /* tp_flags */

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

于 2015-04-02T10:06:00.980 回答