一般論として、オブジェクトへの参照を引数にとる関数はユーザが 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 ユーザレベルに ``逃がし'' てしまうと、 深刻なエラーを引き起こします。