先ほどの関数の例に戻ると、今度は以下の実行文を理解できるはずです:
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 のオブジェクトです。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。