通常,接受对象引用作为参数的函数不希望你传给它们 NULL 指针,并且当你这样做时将会转储核心(或在以后导致核心转储)。 返回对象引用的函数通常只在要指明发生了异常时才返回 NULL。 不检测 NULL 参数的原因在于这些函数经常要将它们所接收的对象传给其他函数 --- 如果每个函数都检测 NULL,将会导致大量的冗余检测而使代码运行得更缓慢。
更好的做法是仅在“源头”上检测 NULL,即在接收到一个可能为 NULL 的指针,例如来自 malloc() 或是一个可能引发异常的函数的时候。
Py_INCREF() 和 Py_DECREF() 等宏不会检测 NULL 指针 --- 但是,它们的变种 Py_XINCREF() 和 Py_XDECREF() 则会检测。
用于检测特定对象类型的宏 (Pytype_Check()) 不会检测 NULL 指针 --- 同样地,有大量代码会连续调用这些宏来测试一个对象是否为几种不同预期类型之一,这将会生成冗余的测试。 不存在带有 NULL 检测的变体。
C 函数调用机制会保证传给 C 函数的参数列表 (本示例中为 args) 绝不会为 NULL --- 实际上它会保证其总是为一个元组 4。
任何时候将 NULL 指针“泄露”给 Python 用户都会是个严重的错误。 |