Подтвердить что ты не робот

Отображение файлового объекта из Cython

Мне нужно выставить файл-подобный объект из библиотеки 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 - чистый питон? Я думаю, что производительность будет страдать, но она будет работать, правильно?

4b9b3361

Ответ 1

Было бы слишком неэффективно вызывать os.fdopen() в номере дескриптора файла, возвращаемом базовой библиотекой, а затем отправлять обычные вызовы метода Python в результирующий файловый объект, чтобы сделать ваш ввод и вывод? С большинством ввода-вывода я был бы удивлен, если бы вы могли видеть разницу с тем, вызвали ли вы подпрограмму C напрямую или позвольте логике отправки метода Python вызвать ее для вас, - но, конечно, вы можете оказаться в необычной ситуации, и я может быть неправильным!