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;
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') */
{
char *file;
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) */
}
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。