2017-07-29 8 views
1

numpyのアレイ、ある拡張型(別名拡張でC APIを使用して定義された)、numpyののarray interfaceに記載されているように、Buffer Structure(例えばdata属性、Pythonインタプリタの範囲外の追加フィールドを宣言する。
Pickle protocol部(__reduce__は依然としてのPython 3に存在する場合でも、それをシリアライズすることができ、Pythonの2 docに述べたように、ピックルプロトコルの一部として__reduce__機能を使用するために使用され、hereを説明する。Python 3はどのように拡張タイプ、特にNumpy配列をpickleするのか知っていますか?

しかしそしてPickling and unpickling extension types)がdocから削除されたので、何が何をするのかは不明です。
はまた、酸洗拡張タイプに関連する追加エントリがある:

    copyreg
  • Pickle interface constructor registration for extension typesとして説明したが、copyregモジュール自体で拡張タイプの言及はありません。
  • PEP 3118 -- Revising the buffer protocolこれはPython 3の新しいバッファプロトコルをリリースしました(そしておそらく、このバッファプロトコルのための酸洗いを自動化します)。
  • 新しいスタイルクラス:新しいスタイルのクラスが酸洗プロセスに影響を与えると考えることができます。

だから、どのようにこのすべてnumpyのアレイに関連しています:

  1. numpyの配列は、それら(またはcopyreg)をpickle化する方法でPythonを知らせるために、このような__reduce__のような特別なメソッドを実装していますか? Numpyオブジェクトはまだ__reduce__メソッドを公開していますが、これは互換性のためです。
  2. NumpyはPickle(新しいbuffer protocolのような)のボックスの外でサポートされているPythonのC-API構造体を使用しているので、numpy配列を漬け込むために補足は必要ありませんか?
+3

'__reduce__'はまだPython 3に存在します。 –

+0

.. [ここにはPython 3で' __reduce__'が記述されているドキュメントがあります](https://docs.python.org/3/library/pickle。 html?highlight = pickle#オブジェクト.__ reduce__)。 – Phillip

+0

ポイントは、 'reduce'がまだ存在していても、' reduce'文書内の拡張タイプへの言及が削除されていることです。しかし、それは受け入れられた答え(そして次のコメント)で述べられているように、まだ真実であると言われました。 – Phylliade

答えて

3

Python 3 picklesupports __reduce__の場合は、Pickling Class Instances sectionの対象となります。

Numpyのサポートはこの点で変更されていません。値は、その関数の引数のタプルを再現する関数オブジェクトからなる3要素のタプルが返され

>>> 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')) 

、そして:これは、Python 2または3のいずれかに酸洗をサポートするために、アレイ上__reduce__を実装します状態タプルはno newinstance.__setstate__()を渡します。

+0

[拡張機能のピックリングとアンピックル](https://docs.python.org/2.7/library/pickle.html#pickling-and-unpickling-extension-types)に記載されていることはまだ正しいですか?なぜ彼らは '__reduce__'文書を'拡張タイプ 'からもっと一般的な 'クラスインスタンス'セクションに移しましたか? – Phylliade

+1

@Phylliade:はい、すべてはまだ真です。このメソッドはエクステンションの型に限定されるものではありません(カスタムPythonのクラスとエクステンションの型の間の線は大部分がぼやけています)。 –

+1

@Phylliade: '__reduce__'は下位レベルのコピープロトコル実装です。カスタムPythonクラスは、可能であれば、より高水準の( '__getnewargs_ex__'/'__getstate__' /' __setstate__')メソッドを実装する必要があります。デフォルトの '__reduce__'実装ではそれらを使用します。 –

関連する問題