「拡張と埋め込みpython解釈器」1.7拡張関数からパラメータを抽出

2336 ワード

1.7拡張関数でのパラメータの抽出
PyArg_ParseTuple()関数は次のように宣言されます.
 
int PyArg_ParseTuple(PyObject *arg, char *format, ...);

Argパラメータは、PythonからC関数に渡されるパラメータのリストを含むメタグループオブジェクトである必要があります.formatパラメータのフォーマットはフォーマットされた文字列でなければなりません.フォーマットされた文字列の構文は「Parsing arguments and building values」のPython/C API Reference Manual章で説明されています.他のパラメータは変数アドレスでなければなりません.そのタイプはフォーマットされた文字列パラメータによって決まります.
注意:PyArg_ParseTuple()関数Pythonパラメータに必要なタイプをチェックすると、呼び出しC変数アドレスの有効性をチェックできません.入力エラーが発生した場合、コードがクラッシュしたり、メモリのランダムアドレスが少なくとも書き換えられたりする可能性があります.だから気をつけて!
呼び出し元に提供されるPythonオブジェクト参照はborrowed参照であり、参照カウントは増加しないことに注意してください.
いくつかの呼び出し例:
 
    int ok;
    int i, j;
    long k, l;
    const char *s;
    int size;

    ok = PyArg_ParseTuple(args, ""); /* No arguments */
        /* Python call: f() */
 
    ok = PyArg_ParseTuple(args, "s", &s); /* A string */
        /* Possible Python call: f('whoops!') */
 
    ok = PyArg_ParseTuple(args, "lls", &k, &l, &s); /* Two longs and a string */
        /* Possible Python call: f(1, 2, 'three') */
 
    ok = PyArg_ParseTuple(args, "(ii)s#", &i, &j, &s, &size);
        /* A pair of ints and a string, whose size is also returned */
        /* Possible Python call: f((1, 2), 'three') */
 
    {
        const char *file;
        const char *mode = "r";
        int bufsize = 0;
        ok = PyArg_ParseTuple(args, "s|si", &file, &mode, &bufsize);
        /* A string, and optionally another string and an integer */
        /* Possible Python calls:
           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);
        /* A rectangle and a point */
        /* Possible Python call:
           f(((0, 0), (400, 300)), (10, 10)) */
    }
 
    {
        Py_complex c;
        ok = PyArg_ParseTuple(args, "D:myfunction", &c);
        /* a complex, also providing a function name for errors */
        /* Possible Python call: myfunction(1+2j) */
    }