##
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` にならないよう 保証しています -- 実際には、常にタプル型になるよう保証しています。 4

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

#### Footnotes

... 実際には、常にタプル型になるよう保証しています。4
  ``旧式の'' 呼び出し規約を使っている場合には、この保証は 適用されません -- 既存のコードにはいまだに旧式の呼び出し規約が 多々あります