PyArg_ParseTupleAndKeywords() は、以下のように宣言されています:
int PyArg_ParseTupleAndKeywords(PyObject *arg, PyObject *kwdict,
char *format, char *kwlist[], ...);
arg と format パラメタはPyArg_ParseTuple() のものと同じです。kwdict パラメタはキーワード引数の入った 辞書で、 Python ランタイムシステムから第三パラメタとして受け取ります。 kwlist パラメタは各パラメタを識別するための文字列からなる、 NULL終端されたリストです; 各パラメタ名は format 中の 型情報に対して左から右の順に照合されます。
成功するとPyArg_ParseTupleAndKeywords() は真を返し、 それ以外の場合には適切な例外を送出して偽を返します。
注意: キーワード引数を使っている場合、タプルは入れ子にして使えません! kwlist 内に存在しないキーワードパラメタが渡された場合、 TypeError の送出を引き起こします。
以下にキーワードを使ったモジュール例を示します。これは Geoff Philbrick (philbrick@hks.com) によるプログラム例を もとにしています:
#include "Python.h"
static PyObject *
keywdarg_parrot(PyObject *self, PyObject *args, PyObject *keywds)
{
int voltage;
char *state = "a stiff";
char *action = "voom";
char *type = "Norwegian Blue";
static char *kwlist[] = {"voltage", "state", "action", "type", NULL};
if (!PyArg_ParseTupleAndKeywords(args, keywds, "i|sss", kwlist,
&voltage, &state, &action, &type))
return NULL;
printf("-- This parrot wouldn't %s if you put %i Volts through it.\n",
action, voltage);
printf("-- Lovely plumage, the %s -- It's %s!\n", type, state);
Py_INCREF(Py_None);
return Py_None;
}
static PyMethodDef keywdarg_methods[] = {
/* PyCFunction の値は PyObject* パラメタを二つだけしか引数に
* 取らないが、 keywordarg_parrot() は三つとるので、キャストが
* 必要。
*/
{"parrot", (PyCFunction)keywdarg_parrot, METH_VARARGS | METH_KEYWORDS,
"Print a lovely skit to standard output."},
{NULL, NULL, 0, NULL} /* センティネル値 */
};
void
initkeywdarg(void)
{
/* モジュールを作成して関数を追加する */
Py_InitModule("keywdarg", keywdarg_methods);
}
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。