20

Cython モジュールでラップしている C ライブラリからファイルのようなオブジェクトを公開する必要があります。バッファリング、readline() などに python のジェネリック io コードを再利用したい。

新しいIOモジュールは私が必要としているもののようですが、実際にCythonからそれを使用することは自明ではないようです.私はいくつかのアプローチを試しました:

  • IO.RawIOBase から継承する cdef クラスの私のコード - cdef クラスは他の cython cdef クラスからのみ継承できるのに対し、IO は「生の」C であるため、これは失敗します。

  • cdef クラスと、私の cdef クラスと RawIOBase の両方を継承する別の (非 cdef) クラスのコード - 「TypeError: 複数のベースにインスタンス レイアウトの競合があります」で失敗する

  • RawIOBase から継承する (非 cdef) クラスのコード - これは機能しますが、C レベル (基礎となるライブラリと対話する必要がある) のものをクラス内に格納する機能が失われるため、make が必要です。それをcdefラッパーで囲み、それをメンバーとして保存します...これは混乱のように見えます。

  • (Raw)IOBase を継承しない cdef クラスの私のコードは、その機能を再実装します。Python コードは、オブジェクトを BufferedReader/BufferedWriter でラップします。

私の質問:

1) 私は何かを見逃していて、ここで車輪を再発明していますか?

2) Python の現在および将来のバージョンで BufferedReader/Writer をオブジェクトに満足させるために実装する必要がある IOBase の正確なものは何ですか? これはどこかに文書化されていますか?

3) IO が純粋な python である python 2.6 では、どのように機能しますか? そのパフォーマンスは低下すると思いますが、うまくいきますよね?

4

1 に答える 1

1

os.fdopen()基盤となるライブラリから返されたファイル記述子番号を呼び出し、通常の Python メソッド呼び出しを結果のファイル オブジェクトにディスパッチして、入出力を行うのは非効率的でしょうか? ほとんどの I/O で、C ルーチンを直接呼び出したのか、Python メソッドのディスパッチ ロジックに呼び出してもらったのかで違いがわかるとしたら、私は驚かれることでしょう。間違っている可能性があります!

于 2011-11-24T20:39:02.397 に答える