Мне нужно предоставить файлоподобный объект из библиотеки C, который я обертываю модулем Cython. Я хочу повторно использовать универсальный код ввода-вывода Python для таких вещей, как буферизация, readline () и т. Д.
Кажется, новый модуль ввода-вывода - именно то, что мне нужно, но на самом деле использовать его из Cython нетривиально, я попробовал несколько подходов:
Мой код в классе cdef, который наследуется от IO.RawIOBase - это не удается, потому что классы cdef могут наследоваться только от других классов cython cdef, тогда как IO является «необработанным» C.
Мой код в классе cdef, другом (не-cdef) классе, который наследует как мой класс cdef, так и RawIOBase - Сбой с «TypeError: у нескольких баз есть конфликт размещения экземпляров»
Мой код в классе (не-cdef), который наследуется от RawIOBase - это работает, но я теряю возможность хранить вещи уровня c (которые мне нужны для общения с базовой библиотекой) внутри класса так что мне нужно сделать обертку cdef вокруг нее и сохранить это как член ... это выглядит как беспорядок.
Мой код в классе cdef, который не наследует (Raw) IOBase, скорее, переопределяет его функциональность, код Python помещает мой объект в BufferedReader / BufferedWriter - этот, похоже, работает и менее грязный, чем предыдущий параметр.
Мои вопросы:
1) Я что-то упустил и заново изобретаю колесо?
2) Что именно нужно добавить в IOBase, чтобы BufferedReader / Writer был доволен моим объектом в текущей и будущих версиях python? Это где-нибудь задокументировано?
3) Как это будет работать в Python 2.6, где IO - чистый Python? Я думаю, что производительность пострадает, но это будет работать, верно?