8

私は Python-C 拡張機能について学んでおり、キーワード引数を使用するメソッドを PyCFunctions にキャストする必要がある理由について困惑しています。

PyCFunction についての私の理解は、PyObjects への 2 つのポインターを取り、PyObjects への単一のポインターを返すということです。

 PyObject* myFunc(PyObject* self, PyObject* args)

キーワード引数を使用する関数を使用する場合、この関数は PyObjects への 3 つのポインターを取り、PyObjects への単一のポインターを返します。

 PyObject* myFunc(PyObject* self, PyObject* args, PyObject* keywordArgs)

ただし、モジュール関数配列を作成すると (「adder」という関数の場合):

{ "adder", (PyCFunction)adder, METH_VARARGS | METH_KEYWORDS, "adder method" }

正常に動作します。float を int にキャストしても、float の非整数部分を使用する必要があるように感じます。この作品を見なかったら、うまくいかないと思っていたでしょう。ここで何が理解できませんか?

また、PyCFunctionWithKeywords への参照をいくつか見ました。これは、私が必要だと思った関数シグネチャを持っているようですが、コンパイラは「互換性のないポインター型」について不平を言いました (警告を出しました)。

PyCFunctionWithKeywords は廃止されましたか? そうでない場合、それを使用すべき/使用しなければならない時期はありますか?

4

1 に答える 1

5

関数がキーワード引数を処理する場合、それは PyCFunctionWithKeywords に対応している必要があります。ただし、C はオーバーロードを行わず、PyMethodDef によって構築された構造は、たとえば完全にチェックされていない void * ではなく、PyCFunction を期待するように定義されています。したがって、コンパイラが文句を言うのを止めるには、PyCFunctionWithKeywords を PyCFunction にキャストする必要があります。

関数が PyCFunction ではなく PyCFunctionWithKeywords の署名を持っていることを Python に伝えるために、フラグに METH_KEYWORDS も渡さなければならないことに注意してください。

于 2012-04-22T01:47:03.390 に答える