#
8 拡張モジュール関数のキーワードパラメタ

`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);
    }