1.7 拡張モジュール関数でのパラメタ展開

PyArg_ParseTuple() は、以下のように宣言されています:

int PyArg_ParseTuple(PyObject *arg, char *format, ...);

引数arg は C 関数から Python に渡される引数リストが入った タプルオブジェクトでなければなりません。 format 引数は書式化文字列で、 Python/C API リファレンスマニュアル の ``引数の解釈と値の構築'' で解説されている書法に従わねばなりません。 残りの引数は、それぞれの変数のアドレスで、書式化文字列から 決まる型になっていなければなりません。

PyArg_ParseTuple() は Python 側から与えられた引数が 必要な型になっているか調べるのに対し、PyArg_ParseTuple() は呼び出しの際に渡された C 変数のアドレスが有効な値を持つか調べ られないことに注意してください: ここで間違いを犯すと、コードが クラッシュするかもしれませんし、少なくともでたらめなビットを メモリに上書きしてしまいます。慎重に!

呼び出し側に提供されるオブジェクトへの参照はすべて 借用 参照 (borrowed reference) になります; これらのオブジェクトの参照 カウントをデクリメントしてはなりません!

以下にいくつかの呼び出し例を示します:

    int ok;
    int i, j;
    long k, l;
    const char *s;
    int size;

    ok = PyArg_ParseTuple(args, ""); /* 引数なし */
        /* Python での呼び出し: f() */

    ok = PyArg_ParseTuple(args, "s", &s); /* 文字列 */
        /* Python での呼び出し例: f('whoops!') */

    ok = PyArg_ParseTuple(args, "lls", &k, &l, &s); 
        /* 二つの long と文字列 */
        /* Python での呼び出し例: f(1, 2, 'three') */

    ok = PyArg_ParseTuple(args, "(ii)s#", &i, &j, &s, &size);
        /* 二つの int と文字列、文字列のサイズも返す */
        /* Python での呼び出し例: f((1, 2), 'three') */

    {
        const char *file;
        const char *mode = "r";
        int bufsize = 0;
        ok = PyArg_ParseTuple(args, "s|si", &file, &mode, &bufsize);
        /* 文字列、オプションとして文字列がもう一つと整数が一つ */
        /* Python での呼び出し例:
           f('spam')
           f('spam', 'w')
           f('spam', 'wb', 100000) */
    }

    {
        int left, top, right, bottom, h, v;
        ok = PyArg_ParseTuple(args, "((ii)(ii))(ii)",
                 &left, &top, &right, &bottom, &h, &v);
        /* 矩形と点を表現するデータ */
        /* Python での呼び出し例:
           f(((0, 0), (400, 300)), (10, 10)) */
    }

    {
        Py_complex c;
        ok = PyArg_ParseTuple(args, "D:myfunction", &c);
        /* 複素数。エラー発生時用に関数名も指定 */
        /* Python での呼び出し例: myfunction(1+2j) */
    }

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。