9

2.7にバックポートされた PEP 3118をサポートするために、ライブラリ (Python 2.7 をサポートする) のクラスを拡張している最中です。

ドキュメントから、tp_as_bufferを指すようにフィールドを初期化する必要がありますPyBufferProcs。ただし、2.7 のドキュメントによると、この構造体の説明には古いバッファ プロトコルのエントリしか含まれていません。ソースから、新しいプロトコル (および)の追加エントリがいくつかあることを収集し ます。 PyBufferProcsbf_getbufferbf_releasebuffer

疑問は残ります:

  • これらの新しいエントリが有効であることを Python に伝えるために何か特別なことをする必要がありますか?

  • 古いプロトコルのエントリを入力する必要がありますか? (たとえば、2.7 のドキュメントには、bf_getsegcount null ではない可能性があると記載されています。ただし、PEP 3118 をサポートしている場合は、このエントリを使用しないでください。)

4

1 に答える 1

2

の最後の 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 に答える