Определение PyBufferProcs в Python 2.7, когда класс реализует PEP 3118

Я нахожусь в процессе расширения классов в нашей библиотеке (которая поддерживает Python 2.7) для поддержки PEP 3118, которая была перенесена обратно в 2.7.

Из документации мне нужно инициализировать tp_as_buffer поле, чтобы указать на PyBufferProcs, Однако из документации для 2.7 описание этой структуры содержит только записи для старого буферного протокола. Из источников я понимаю, что PyBufferProcs имеет несколько дополнительных записей для нового протокола (bf_getbuffer а также bf_releasebuffer).

Вопросы остаются:

  • Должен ли я сделать что-то особенное, чтобы сообщить Python, что эти новые записи действительны?

  • Нужно ли заполнять записи для старого протокола? (Документация для 2.7 говорит, например, что bf_getsegcount не может быть нулевым Но эту запись не следует использовать, если я поддерживаю PEP 3118.)

1 ответ

Вы можете просто заполнить два последних поля PyBufferProcs но вы должны добавить Py_TPFLAGS_HAVE_NEWBUFFER флаг к tp_flags из ваших типов. Это особенность, которая была введена в python2, чтобы сделать новый протокол доступным вместе со старым.

Я понятия не имею, почему это нигде не задокументировано, но вы можете видеть, что это используется в определении bytearray наберите для python 2.7 (см. здесь):

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

Этот контент уже был размещен в комментариях, но он заслуживает ответа.

Другие вопросы по тегам