#
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) */
        }