如何检测Python类型是否实现了buffer protocol缓冲区协议
检测Python类型是否实现Buffer Protocol的可靠方法
分为C API层面和Python层面两种场景,对应不同的判断方案:
C API 层面判断
- 不要直接判断
tp_as_buffer是否为空,该字段未初始化时可能残留随机值,单独判空完全不可靠。 - 推荐直接调用官方内置的
PyObject_CheckBuffer()函数,该函数在Python 3.3及以上版本提供,内部会完成所有合法性校验,返回1表示对象支持Buffer Protocol,返回0表示不支持,无需自行处理类型字段的边界逻辑。 - 如果需要兼容Python 3.3以下版本,可以手动校验两个必要条件:
- 类型的
tp_as_buffer字段非空 tp_as_buffer指向的结构体中,bf_getbuffer回调函数指针非空
只有两个条件同时满足时,类型才真正实现了Buffer Protocol,bf_getbuffer是协议的核心实现入口,缺失该回调的tp_as_buffer没有实际意义。
- 类型的
Python 层面判断
最通用的方案是尝试用memoryview封装目标对象,不抛出异常即代表支持Buffer Protocol,示例代码如下:
def is_buffer_supported(obj): try: memoryview(obj) except TypeError: return False return True
该方法兼容所有Python 3版本,不需要引入额外依赖,覆盖了所有内置和自定义的Buffer Protocol实现类。
内容的提问来源于stack exchange,提问作者bli0406
相关产品推荐
相关产品推荐

