20

我需要从我用 Cython 模块包装的 C 库中公开一个类似文件的对象。我想将 python 的通用 io 代码重用于缓冲、readline() 等内容。

新的 IO 模块似乎正是我所需要的,但实际上从 Cython 使用它似乎并不简单,我尝试了几种方法:

  • 我在从 IO.RawIOBase 继承的 cdef 类中的代码 - 这失败了,因为 cdef 类只能从其他 cython cdef 类继承,而 IO 是“原始”C。

  • 我在 cdef 类中的代码,另一个(非 cdef)类继承了我的 cdef 类和 RawIOBase - 失败并显示“TypeError:多个基础有实例布局冲突”

  • 我在从 RawIOBase 继承的(非 cdef)类中的代码 - 这有效,但我失去了在类中存储我的 c 级别(我需要与底层库对话)东西的能力,所以我需要一个 make围绕它的 cdef 包装器并将其存储为成员......这看起来像一团糟。

  • 我在 cdef 类中的代码不继承 (Raw)IOBase 而是重新实现了它的功能,Python 代码将我的对象包装在 BufferedReader/BufferedWriter 中 - 这个似乎工作并且比前一个选项更不混乱。

我的问题:

1)我错过了什么并在这里重新发明轮子吗?

2) 为了让 BufferedReader/Writer 在当前和未来版本的 python 中对我的对象感到满意,我需要实现哪些来自 IOBase 的确切内容?这在任何地方都有记录吗?

3)在 IO 是纯 python 的 python 2.6 中,这将如何工作?我想性能会受到影响,但它会起作用,对吧?

4

1 回答 1

1

os.fdopen()调用底层库返回的文件描述符编号,然后将正常的 Python 方法调用分派到生成的文件对象以进行输入和输出,是否效率太低?对于大多数 I/O,如果您能看到直接调用 C 例程或让 Python 方法调度逻辑为您调用它的区别,我会感到惊讶——但是,当然,您可能处于不寻常的情况,我可能是错的!

于 2011-11-24T20:39:02.397 回答