Cython を使用して、最初の Python 拡張機能を構築しようとしています。
私のCファイルは論理的に分割されており、機能は「ネスト」されています。そのモジュールCは、モジュールBで定義された関数に依存し、モジュールAに依存します。
機能モジュール間の依存関係を維持できるように、.pxd ファイルと .pyx ファイルを分割する方法を理解するのが難しいと感じています。
次のスニペットは、うまくいけば状況を明確にするのに役立つはずです:
注: ファイル FooBar.h には、一般的なデータ型を宣言し、これらの一般的な型 (myArray および mySet) の単純な API を提供するファイル CommonDefs.h が含まれています。
CommonDefs.h と CommonDefs.c で宣言/定義されたデータ型と関数をエクスポートする ccommontypes.pxd と commontypes.pyx ファイルを既に作成しています。そこからpython拡張モジュールを正常にコンパイルできました。
CommonDefs.h に依存するデータ型と関数をエクスポートする次の段階に進みたいと思います。ただし、タイプ myArray および mySet を再宣言する必要があることがわかりました (これらは ccommontypes.pxd で既に宣言されていましたが)。
関数はタイプ myArray および mySet の引数を取るため、これらの宣言をインポートまたはインクルードする方法がとにかく見つからないようです。そのため、以下のファイルでそれらを再宣言する必要があります。
質問 1 以下で行ったように型を再度宣言しても問題ありませんか、それとも注意が必要な問題はありますか?
//cfoobar.pxd
cdef extern from "../include/FooBar.h":
cdef struct FooBar:
pass
ctypedef struct myArray: // already declared elsewhere
pass
ctypedef struct mySet: // Already declared elsewher
pass
struct FooBar * foobar_new(mySet *s1)
//foobar.pyx
cimport cfoobar
cdef class FooBar:
cdef cfoobar.FooBar *_foobar
def __cinit__(self, myset):
_foobar = cfoobar.foobar_new(myset);
if (ret == 0):
raise MemoryError()
質問 2 上記の FooBar ctor コードから、メモリ割り当て関数は mySet 変数へのポインタを期待しています。ただし、このコードをコンパイルしようとすると、次のエラーが発生します。
Python オブジェクトを 'mySet *' に変換できません
エラーメッセージは理解できましたが、Python は静的型付けされていないため、データ型を指定する方法がわかりません。
これを解決するための助けをいただければ幸いです。