Python 3如何知道如何挑选扩展类型,特别是Numpy数组?

Numpy数组,即扩展类型(也称为使用扩展C API定义),声明Python解释器范围之外的其他字段(例如数据属性,它是一个缓冲结构,如Numpy的array interface中所述).
为了能够序列化,Python 2曾经使用__reduce__函数作为pickle协议的一部分,如doc所述,并解释了here.

但是,即使在Python 3中仍然存在__reduce__,也会从文档中删除Pickle协议部分(以及pickeling和unpickling扩展类型),因此不清楚是什么做的.
此外,还有与酸洗扩展类型相关的其他条目:

> copyreg,描述为扩展类型的Pickle接口构造函数注册,但copyreg模块本身没有提及扩展类型.
> PEP 3118 — Revising the buffer protocol为Python 3发布了一个新的缓冲协议(并且可能自动为这个缓冲协议进行酸洗).
>新式课程:可以假设新式课程对酸洗过程有影响.

那么,所有这些与Numpy数组有什么关系:

> Numpy数组是否实现了特殊的方法,比如__reduce__来告诉Python如何腌制它们(或copyreg)? Numpy对象仍然暴露__reduce__方法,但可能是出于兼容性原因.
> Numpy是否使用了Pickle开箱即用的Python的C-API结构(就像新的缓冲协议一样),因此为了挑选numpy数组,没有必要补充?

最佳答案
Python 3泡菜仍然是supports __reduce__,它涵盖在Pickling Class Instances section之下.

Numpy的支持在这方面没有改变;它在数组上实现__reduce__以支持Python 2或3中的pickling:

>>> import numpy
>>> numpy.array(0).__reduce__()
(<built-in function _reconstruct>, (<class 'numpy.ndarray'>, (0,), b'b'), (1, (), dtype('int64'), False, b'\x00\x00\x00\x00\x00\x00\x00\x00'))

返回一个三元素元组,包括一个用于重新创建值的函数对象,一个用于该函数的参数元组,以及一个不传递新实例的状态元组.__ setstate __().

转载注明原文:Python 3如何知道如何挑选扩展类型,特别是Numpy数组? - 代码日志