#
3 例に戻る

先ほどの関数の例に戻ると、今度は以下の実行文を理解できるはずです:

        if (!PyArg_ParseTuple(args, "s", &command))
            return NULL;

この実行文は、`PyArg_ParseTuple()` がセットする例外 によって、引数リストに何らかのエラーが生じたときに`NULL` (オブジェクトへのポインタを返すタイプの関数におけるエラー標示値) を返します。エラーでなければ、引数として与えた文字列値はローカル な変数 `command` にコピーされています。 この操作はポインタ代入であり、ポインタが指している文字列に対して 変更が行われるとは想定されていません (従って、標準 C では、 変数 `command` は "`const char* command`" として 適切に定義せねばなりません)。

次の文では、`PyArg_ParseTuple()` で得た文字列を 渡して Unix 関数 `system()` を呼び出しています:

        sts = system(command);

`spam.system()` は `sts` を Python オブジェクト として返さねばなりません。これには、`PyArg_ParseTuple()` の逆ともいうべき関数`Py_BuildValue()` を使います: `Py_BuildValue()` は書式化文字列と任意の数の C の値を 引数にとり、新たな Python オブジェクトを返します。 `Py_BuildValue()` に関する詳しい情報は後で示します。

        return Py_BuildValue("i", sts);

上の場合では、`Py_BuildValue()` は整数オブジェクトを 返します。(そう、整数ですら、 Python においてはヒープ上の オブジェクトなのです! )

何ら有用な値を返さない関数 (`void` を返す関数) に 対応する Python の関数は`None` を返さねばなりません。 関数に `None` を返させるには、以下のような慣用句を使います (この慣用句はPy_RETURN_NONE マクロに実装 されています):

        Py_INCREF(Py_None);
        return Py_None;

`Py_None` は特殊な Pyhton オブジェクトである `None` に 対応する C での名前です。これまで見てきたようにほとんどのコンテキスト で ``エラー'' を意味する `NULL` ポインタとは違い、`None` は純粋な Python のオブジェクトです。