Определение 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 * /
Этот контент уже был размещен в комментариях, но он заслуживает ответа.