1.10.4 NULL ポインタ

一般論として、オブジェクトへの参照を引数にとる関数はユーザが NULL ポインタを渡すとは予想しておらず、渡そうとすると コアダンプになる (か、あとでコアダンプを引き起こす) ことでしょう。 一方、オブジェクトへの参照を返すような関数は一般に、例外の発生を 示す場合にのみ NULL を返します。引数に対して NULL テストを 行わない理由は、こうした関数群はしばしば受け取った関数を他の関数へと 引き渡すからです -- 各々の関数が NULLテストを行えば、 冗長なテストが大量に行われ、コードはより低速に動くことになります。

従って、NULL のテストはオブジェクトの ``発生源''、すなわち 値が NULL になるかもしれないポインタを受け取ったときだけに しましょう。malloc() や、例外を送出する可能性の ある関数がその例です。

マクロPy_INCREF() および Py_DECREF()NULL ポインタのチェックを行いません -- しかし、これらの マクロの変化形である Py_XINCREF() および Py_XDECREF() は チェックを行います。

特定のオブジェクト型について調べるマクロ (Pytype_Check()) は NULL ポインタのチェックを行いません -- 繰り返しますが、 様々な異なる型を想定してオブジェクトの型を調べる際には、こうした マクロを続けて呼び出す必要があるので、個別に NULL ポインタの チェックをすると冗長なテストになってしまうのです。 型を調べるマクロには、NULL チェックを行う変化形はありません。

Python から C 関数を呼び出す機構は、 C 関数に渡される引数リスト (例でいうところの args) が決して NULL にならないよう 保証しています -- 実際には、常にタプル型になるよう保証しています。 1.4

NULL ポインタを Python ユーザレベルに ``逃がし'' てしまうと、 深刻なエラーを引き起こします。



脚注

... 実際には、常にタプル型になるよう保証しています。1.4
``旧式の'' 呼び出し規約を使っている場合には、この保証は 適用されません -- 既存のコードにはいまだに旧式の呼び出し規約が 多々あります
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。