1

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 は静的型付けされていないため、データ型を指定する方法がわかりません。

これを解決するための助けをいただければ幸いです。

4

1 に答える 1

0

自分でpxdsの再宣言の問題を整理しようとしているときに、この質問に出くわしました...いくつかの「落とし穴」があるに違いないと思いますが、それらが何であるかはまだ言いません。:)

しかし、質問 2: python は動的に型指定されますが、cython はそうではありません...型のない変数は python オブジェクトとして静的に型指定されるだけです。

あなたは変えられる:

def __cinit__(self, myset):

に:

def __cinit__(self, mySet *myset):

本当に myset へのポインターを渡している場合...

于 2012-04-29T23:28:17.890 に答える