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