1.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 のオブジェクトです。

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