我正在使用Python C扩展文档来定义新类型,并刚刚完成了Providing finer control over data attributes部分。
在本节中,他们更改了示例代码,以确保first
结构的last
和Noddy
属性永远不会是NULL
,例如通过初始化如果用户试图删除或以其他方式将这些属性设置为Null,则在new
中清空字符串并添加引发TypeError
的getter和setter。
此外(以及我的问题),作者将这些属性的所有Py_XDECREF
更改为Py_DECREF
,并说明:
通过这些更改,我们可以确保第一个和最后一个成员永远不会为NULL,因此我们几乎可以在所有情况下删除对NULL值的检查。这意味着大多数Py_XDECREF()调用都可以转换为Py_DECREF()调用。我们无法更改这些调用的唯一地方是在deallocator中,这些成员的初始化可能在构造函数中失败。
在我看来,使用Py_XDECREF
会更安全,因为如果Py_DECREF
传递segmentation fault
值,NULL
会产生Py_DECREF
。
使用Py_XDECREF
而非function sum()
{
var w = document.getElementById('num1').value || 0;
var x = document.getElementById('num2').value || 0;
var y = document.getElementById('num3').value || 0;
var z=parseInt(w)+parseInt(x)+parseInt(y);
document.getElementById('final').value=z;
};
有什么好处?
答案 0 :(得分:6)
如果您知道该对象不能为NULL,则Py_DECREF
优于Py_XDECREF
的好处是:
在处理低级代码时,这两点都很重要,这就是为什么Python核心和大多数扩展在指针实际上可以为NULL时只小心使用Py_XDECREF
(或Py_CLEAR
)的原因。